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

Good SPARQL query to find all triples with a resource as subject or object

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

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}
}

但是,后者的格式已关闭。它首先给我 po 输出,将 s 留空,然后 spo 留空。此外,第一个查询需要更多的时间来执行。如果能解释一下这两个查询的工作原理以及输出差异的原因,我将不胜感激。

However, the formatting of the latter is off

那是因为两个查询都有不同的结果集 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 过滤器快得多。

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

Also, the first query takes more time to execute.

如果没有 EXPLAIN() 的结果很难说,但我的第一个猜测是相等过滤器使用索引,而 OR 过滤器使用完整的 table 扫描。 Virtuoso 不 seem to generate good query plans 嵌套过滤器。

Try this--

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

-- 或者只是--

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

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