很好的SPARQL查询,可以找到以资源作为主题或对象的所有三元组

很好的SPARQL查询,可以找到以资源作为主题或对象的所有三元组,sparql,semantic-web,linked-data,Sparql,Semantic Web,Linked Data,我需要在DBpedia上找到所有三元组,其中是主语或宾语。此查询以最适合我的格式为我提供所需的输出—只有三个变量,没有空格: PREFIX : <http://dbpedia.org/resource/> SELECT * WHERE { ?s ?p ?o FILTER (?s=:Benin OR ?o=:Benin) } 如果我有以下查询,我会得到类似的结果: PREFIX : <http://dbpedia.org/resource/> SELECT * WHERE

我需要在DBpedia上找到所有三元组,其中是主语或宾语。此查询以最适合我的格式为我提供所需的输出—只有三个变量,没有空格:

PREFIX : <http://dbpedia.org/resource/>
SELECT * WHERE {
?s ?p ?o
FILTER (?s=:Benin OR ?o=:Benin)
}
如果我有以下查询,我会得到类似的结果:

PREFIX : <http://dbpedia.org/resource/>
SELECT * WHERE {
{:Benin ?p ?o}
UNION
{?s ?p :Benin}
}
但是,后者的格式设置已关闭。它首先给我p和o输出,留下s空白,然后s和p留下o空白。而且,第一个查询需要更多的时间来执行。如果能解释一下这两个查询是如何工作的,以及为什么输出会有差异,我将不胜感激

但是,后者的格式设置已关闭

这是因为两个查询与SELECT*一起具有不同的结果集。并集连接元组,但由于某些元组缺少部分,因此会得到扭曲的输出

您可以通过显式列出并选择变量来解决此问题:

PREFIX : <http://dbpedia.org/resource/>
SELECT ?s ?p ?o WHERE {
   {
       ?s ?p ?o
       FILTER (?s=:Benin)
   }
   UNION 
   {
       ?s ?p ?o .
       FILTER (?o=:Benin)
   }
}
注意,在dbpedia上这仍然比OR过滤器快得多

当一个元组匹配两个筛选器表达式时,union将返回重复项,即:Benin?p:Benin。 SELECT DISTINCT将以额外的成本弥补这一问题,而且由于问题似乎不存在,因此为了提高性能,我省略了它

而且,第一个查询需要更多的时间来执行

如果没有解释的结果,这很难说,但我的第一个猜测是相等筛选器使用索引,而OR筛选器使用全表扫描。Virtuoso不支持嵌套过滤器。

-

-或者只是-

DESCRIBE  <http://dbpedia.org/resource/Benin>

您可以在其他各种序列化中获得输出,包括。

或在SPARQL中拼写为| |。@AndyS是的,但dbpedia的后端专家似乎并不在意,尽管我无法在源代码级别上对此进行确认。这很好:-您能演示如何选择序列化格式吗?另外,这是关于SPARQL 1.1官方文档中的描述:描述表单返回一个结果RDF图,其中包含关于资源的RDF数据……描述由查询服务确定。有鉴于此,我们可以假设DBpedia通过descripe提供关于资源的所有信息,特别是当结果有超过2k个三元组时。公共DBpdia端点在所有功能中都有结果集大小限制。如果你想要无限的结果,你需要追求,或者。由于各种原因,描述输出可能与您开始选择的不完全匹配;这方面的后续工作可能是最好的。序列化格式可以通过SPARQL提交表单当前最完整列表上的菜单来选择,或者使用&format=URL参数,或者在SPARQL查询中选择。
DESCRIBE  <http://dbpedia.org/resource/Benin>