SPARQL 联合查询不返回所有解决方案

Posted

技术标签:

【中文标题】SPARQL 联合查询不返回所有解决方案【英文标题】:SPARQL Federated Query Not Returning All Solutions 【发布时间】:2017-10-21 11:03:37 【问题描述】:

这是this question的演变。

基本上,我无法从远程端点获取 SPARQL 查询的所有解决方案。我已经阅读了第 2.4 节here,因为它似乎描述了与我的情况几乎相同的情况。

我的想法是我想根据我本地 RDF 图中的信息从 DBPedia 过滤我的结果。查询在这里:

PREFIX ns1:             
<http://www.semanticweb.org/caeleanb/ontologies/twittermap#>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT *
WHERE 
  ?p ns1:displayName ?name .
  SERVICE <http://dbpedia.org/sparql> 
    ?s rdfs:label ?name .
    ?s rdf:type foaf:Person .
  

我得到的唯一结果是 dbpedia:John_McCain (for ?s)。我认为这是因为 John McCain 是第一个“x”结果中的唯一匹配项,但我不知道如何让查询返回所有匹配项。例如,如果我添加如下过滤器:

SERVICE <http://dbpedia.org/sparql> 
  ?s rdfs:label ?name .
  ?s rdf:type foaf:Person .
  FILTER(?name = "John McCain"@en || ?name = "Jamie Oliver"@en)

然后它正确返回 dbpedia:Jamie_Oliver 和 dbpedia:John_McCain。除非我专门将其添加到这样的过滤器中,否则还有许多其他匹配项(例如 Jamie Oliver)无法通过。

有人可以解释一种提取其余匹配项的方法吗?谢谢。

【问题讨论】:

假设首先计算 SERVICE 子句,您无法执行任何操作,因为公共 DBpedia 端点的默认限制是单个查询将返回 10000 个结果。而且我很确定,您的三重商店的联合查询引擎不会考虑这一点。顺便说一句,知道使用哪个三联商店总是很有趣。 我正在使用 Stardog。但是该死的:/所以基本上我从 DBPedia 收到了 10,000 个结果,而这仅足以匹配 John McCain?当我使用 FILTER 时,我会将大小减小到 10,000 以下,这样我可以看到更多匹配项? 我猜联合查询的 SPARQL 标准假定在指定语义时返回的结果集没有技术限制——这确实是有道理的。是的,我想 John McCain 在前 10,000 个匹配结果中是偶然的。 @AKSW 好吧,我刚刚编写了一个脚本来创建一个 FILTER,其中包含我想要匹配的所有字符串(例如 FILTER(?name="name1" || ?name="name2"... )) 但是当我尝试执行查询时收到 HTTP 500(内部服务器错误)。我的 FILTER 可以使用多长时间有限制吗? 哦,是的,Virtuoso 的 HTTP GET 请求的长度是有限制的。据我记得它是10000 byte 查询字符串的长度。对于更长的查询,您必须使用 POST 请求 【参考方案1】:

看起来这个问题的原因是 SERVICE 块试图从 DBPedia 中提取所有 foaf:Persons,然后根据我的本地 Stardog db 过滤它们。由于查询 DBPedia 时有 10,000 个结果限制,因此只会找到出现在该 10,000 个任意 Persons 集合中的匹配项。为了解决这个问题,我编写了一个脚本来组合一个 FILTER 块,其中包含我的 Stardog db 中的每个字符串名称,并将其附加到 SERVICE 块以进行远程过滤,从而避免达到 10,000 个结果限制。它看起来像这样:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX ns1: <http://www.semanticweb.org/caeleanb/ontologies/twittermap#>

CONSTRUCT
  ?s rdf:type ns1:Person ;
    ns1:Politician .

WHERE 
    ?s rdfs:label ?name .
    ?s rdf:type dbo:Politician .
    FILTER(?name IN ("John McCain"@en, ...)

【讨论】:

只有两个小 cmets:1.) 使用更紧凑的 Turtle 语法 2.) 使用 ?s rdf:type dbo:Politician . 就足够了,因为 dbo:Politiciandbo:Person 的子类,它是foaf:Person @Evan,还有一个小评论:知道said 的人a 可能会成为性能杀手。如果你使用VALUES(或类似的东西),可能你不需要这些a @StanislavKralin,对不起,我对 SPARQL 很陌生,我不确定如何进行替换。我相信我理解 VALUES 块允许基于允许值的表进行多维过滤,但我是否仍需要指定如下内容:WHERE ?s ?p ?o VALUES (?p ?o) (rdf:type dbo:Politician) 这是否通过 rdf 进行过滤来提高性能:type 从 DBPedia 返回结果后? @Evan, VALUES 是提供内联数据的更规范形式,但我认为VALUES (?name) ("John McCain"@en) ("John McGain"@en) ... 不会比FILTER(?name IN ("John McCain"@en, "John McGain"@en, ...) 更高效。但我的意思是可能您的查询会更高效没有?s rdf:type dbo:Politician,尽管可能会出现一些不相关的结果...... @StanislavKralin 啊,我明白了。我很欣赏这个提示,但我认为对于我的用例,我必须保持查询的那部分完整。幸运的是,我不需要太担心性能,因为我将提前运行几个类似的CONSTRUCT 查询来检索基本上被视为静态数据的 Stardog 数据库的三元组。

以上是关于SPARQL 联合查询不返回所有解决方案的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 多表联合查询问题

联合两个查询结果按列

流分析查询联合

多表联合查询:基于注解SQL

hibernate多表联合查询返回的list没有数据,但list.isEmpty()判断为啥不为真

sql注入之mysql的联合查询爆破