良好的 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}
}
但是,后者的格式已关闭。它首先给我 p
和 o
输出,将 s
留空,然后 s
和 p
将 o
留空。此外,第一个查询需要更多的时间来执行。如果能解释一下这两个查询的工作原理以及输出差异的原因,我将不胜感激。
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。
我需要在 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}
}
但是,后者的格式已关闭。它首先给我 p
和 o
输出,将 s
留空,然后 s
和 p
将 o
留空。此外,第一个查询需要更多的时间来执行。如果能解释一下这两个查询的工作原理以及输出差异的原因,我将不胜感激。
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。