首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPARQL多图请求和排序(Virtuoso 7)

SPARQL多图请求和排序(Virtuoso 7)
EN

Stack Overflow用户
提问于 2018-07-27 12:29:18
回答 1查看 109关注 0票数 1

是否可以轻松地提出CONSTRUCT请求,以便能够检查不同图形中的数据并按照“图首选项”对它们进行排序?

比方说我卖产品。对于每种产品,我可能有不同的供应商,因此我的设置如下所示:

代码语言:javascript
复制
<http://data.experiment.com/product/1> <http://purl.org/goodrelations/v1#hasCurrencyValue> "10" <http://data.experiment.com/graph/supplier/1> .
<http://data.experiment.com/product/1> <http://purl.org/goodrelations/v1#hasCurrencyValue> "8" <http://data.experiment.com/graph/supplier/2> .
<http://data.experiment.com/product/2> <http://purl.org/goodrelations/v1#hasCurrencyValue> "5" <http://data.experiment.com/graph/supplier/2> .

对于每个产品规范,我希望它来自<http://data.experiment.com/graph/supplier/1>,然后从<http://data.experiment.com/graph/supplier/2> (如果不在<http://data.experiment.com/graph/supplier/1>中找到)。

这就是我想说的:

代码语言:javascript
复制
CONSTRUCT 
{ 
    <http://data.experiment.com/product/1> ?p ?o .
} 
WHERE 
{ 
    GRAPH <http://data.experiment.com/graph/supplier/1> 
    { 
        OPTIONAL 
        { 
            <http://data.experiment.com/product/1> ?p1 ?o1 . 
        }
    }
    GRAPH <http://data.experiment.com/graph/supplier/2> 
    { 
        OPTIONAL 
        { 
            <http://data.experiment.com/product/1> ?p2 ?o2 . 
        }
    }
    BIND (IF (BOUND(?p1), ?p1, IF (BOUND(?p2), ?p2, UNDEF)) AS ?p)
    BIND (IF (BOUND(?o1), ?o1, IF (BOUND(?o2), ?o2, UNDEF)) AS ?o)
}

如果我知道我在找什么的话,效果确实很好。现在如果我考虑:

代码语言:javascript
复制
CONSTRUCT 
{ 
    <http://data.experiment.com/product/1> ?p ?o . ?o ?cp ?co
} 
WHERE 
{ 
    GRAPH <http://data.experiment.com/graph/supplier/1> 
    { 
        OPTIONAL 
        { 
            <http://data.experiment.com/product/1> ?p1 ?o1 .
            OPTIONAL { ?o1 ?cp1 ?co1 . }  
        }
    }
    GRAPH <http://data.experiment.com/graph/supplier/2> 
    { 
        OPTIONAL 
        { 
            <http://data.experiment.com/product/1> ?p2 ?o2 . 
            OPTIONAL { ?o2 ?cp2 ?co2 . } 
        }
    }
    BIND (IF (BOUND(?p1), ?p1,IF (BOUND(?p2), ?p2, UNDEF)) AS ?p)
    BIND (IF (BOUND(?o1), ?o1,IF (BOUND(?o2), ?o2, UNDEF)) AS ?o)
    BIND (IF (BOUND(?cp1), ?cp1,IF (BOUND(?cp2), ?cp2, UNDEF)) AS ?cp)
    BIND (IF (BOUND(?co1), ?co1,IF (BOUND(?co2), ?co2, UNDEF)) AS ?co)
}

有时它不起作用,因为我显式的BIND ?o,而?o可能不是一个对象-

结构中的Virtuoso RDF01错误差变量值:"1532610063“(标记189个框标志0)不是有效的主题,只有三元组的对象才能是文字

我似乎没有发现任何人试图按“图表”对数据进行排序,而且我也在努力寻找一种“简单”的方法来实现它。我尝试过使用SELECTFROM NAMED,但您仍然需要手动从所需的图形中选择数据。

如果有人能帮忙的话,那是非常受欢迎的。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-08-02 14:14:30

更新我的上一篇文章。给定图书的每个供应商都存储在一个“默认”图中。

代码语言:javascript
复制
# Named graph : http://data.books.com/default
@prefix book: <http://data.books.com/resource/Book/>
@prefix ns: <http://data.books.com/ns#>

book:8780953608758 ns:hasSupplier <http://data.books.com/supplier/Alpha> .
book:8780953608758 ns:hasSupplier <http://data.books.com/supplier/Beta> .


# Named graph : http://data.books.com/supplier/Alpha
@prefix book: <http://data.books.com/resource/Book/>
@prefix price: <http://data.books.com/resource/Price/>
@prefix gr: <http://purl.org/goodrelations/v1#>
@prefix dc: <http://purl.org/dc/terms/>

book:8780953608758 gr:hasPriceSpecification price:8780953608758_FR_EUR .
price:8780953608758_FR_EUR gr:hasCurrencyValue "10" .
book:8780953608758 dc:available 1447632000 .

# Named graph : http://data.books.com/supplier/Beta
@prefix book: <http://data.books.com/resource/Book/>
@prefix price: <http://data.books.com/resource/Price/>
@prefix gr: <http://purl.org/goodrelations/v1#>
@prefix dc: <http://purl.org/dc/terms/>

book:8780953608758 gr:hasPriceSpecification price:8780953608758_FR_USD .
price:8780953608758_FR_USD gr:hasCurrencyValue "8" .
book:8780953608758 dc:available 1547632000 .

查询中的第一个子查询使用图http://data.books.com/default查找和排序图书8780953608758的所有供应商图表。然后,它与该图形匹配另一个模式。

代码语言:javascript
复制
PREFIX book: <http://data.bookeen.com/resource/Book/>

CONSTRUCT 
{
    book:8780953608758 ?p ?o . ?o ?cp ?co .
}
WHERE 
{
    {
        SELECT ?supplier 
        FROM <http://data.books.com/default>
        WHERE 
        {
            VALUES (?supplier ?priority) 
            { 
                (<http://data.books.com/supplier/Beta> 1) 
                (<http://data.books.com/supplier/Alpha> 2)   
            }
            book:8780953608758 <http://data.books.com/ns/hasSupplier> ?supplier.
        }
        ORDER BY ?priority
        LIMIT 1
    }

    GRAPH ?supplier
    {
        book:8780953608758 ?p ?o .
        OPTIONAL { ?o ?cp ?co . }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51557978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档