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)
但是,后者的格式是关闭的。它首先让我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)
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这在 dbpedia 上仍然比OR过滤器快得多。
当元组与两个过滤器表达式(即:Benin ?p :Benin)匹配时,联合将返回重复项。
SELECT DISTINCT会以额外的成本来解决这个问题,而且由于看起来问题不存在,我省略了它以提高性能。
此外,第一个查询需要更多时间来执行。
如果没有 an 的结果很难说EXPLAIN(),但我的第一个猜测是相等过滤器使用索引,而OR过滤器使用全表扫描。Virtuoso 似乎没有为嵌套过滤器生成好的查询计划。
尝试这个-
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。