良好的 SPARQL 查询,用于查找以资源为主题或对象的所有三元组

kur*_*ous 5 semantic-web sparql linked-data

我需要在 DBpedia 上找到所有的三元组,其中http://dbpedia.org/resource/Benin是一个主题或对象。这个查询以最适合我的格式提供了我想要的输出(只有三个变量,没有空格):

PREFIX : <http://dbpedia.org/resource/>
SELECT * WHERE {
?s ?p ?o
FILTER (?s=:Benin OR ?o=:Benin)
}
Run Code Online (Sandbox Code Playgroud)

如果我有这个查询,我会得到类似的结果:

PREFIX : <http://dbpedia.org/resource/>
SELECT * WHERE {
{:Benin ?p ?o}
UNION
{?s ?p :Benin}
}
Run Code Online (Sandbox Code Playgroud)

但是,后者的格式是关闭的。它首先让我po输出,保留s空白,然后sp留下o的空白。此外,第一个查询需要更多时间来执行。我将非常感谢您对这两个查询如何工作的机制以及输出为何存在差异的解释。

dhk*_*hke 5

但是,后者的格式是关闭的

那是因为两个查询与SELECT *. 联合连接元组,但由于某些元组缺少部分,您会得到倾斜的输出。

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

PREFIX : <http://dbpedia.org/resource/>
SELECT ?s ?p ?o WHERE {
   {
       ?s ?p ?o
       FILTER (?s=:Benin)
   }
   UNION 
   {
       ?s ?p ?o .
       FILTER (?o=:Benin)
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这在 dbpedia 上仍然比OR过滤器快得多。

当元组与两个过滤器表达式(即:Benin ?p :Benin)匹配时,联合将返回重复项。 SELECT DISTINCT会以额外的成本来解决这个问题,而且由于看起来问题不存在,我省略了它以提高性能。

此外,第一个查询需要更多时间来执行。

如果没有 an 的结果很难说EXPLAIN(),但我的第一个猜测是相等过滤器使用索引,而OR过滤器使用全表扫描。Virtuoso 似乎没有为嵌套过滤器生成好的查询计划


Tal*_*Ted 3

尝试这个-

PREFIX : <http://dbpedia.org/resource/>
DESCRIBE  :Benin
Run Code Online (Sandbox Code Playgroud)

- 要不就 -

DESCRIBE  <http://dbpedia.org/resource/Benin>
Run Code Online (Sandbox Code Playgroud)

您可以通过各种其他序列化获得输出,包括N-triples

  • 公共 DBpdia 端点对所有功能都有结果集大小限制。如果您想要无限的结果,您将需要追求[经过身份验证的访问](http://wiki.dbpedia.org/OnlineAccess),或[获取您自己的实例](http://virtuoso.openlinksw.com/dataspace/doc /dav/wiki/Main/VirtPayAsYouGoEBSBackedAMIDBpedia2015)。由于各种原因,“DESCRIBE”输出可能与您开始时使用的“SELECT”不完全匹配;对此的跟进可能最好带到[Virtuoso 用户邮件列表](https://lists.sourceforge.net/lists/listinfo/virtuoso-users/)。 (2认同)