我想执行以下查询:
SELECT ?name1 ?name2 WHERE {
?article1 rdf:type bench:Article .
?article2 rdf:type bench:Article .
?article1 dc:creator ?author1 .
?author1 foaf:name ?name1 .
?article2 dc:creator ?author2 .
?author2 foaf:name ?name2 .
?article1 swrc:journal ?journal .
?article2 swrc:journal ?journal .
}
这是一个复杂的查询,所以要对RDF数据执行此查询,我想要遵循这种方法
现在我的困惑是它会产生完美的输出,就像正常连接一样,不是???? ..
答案 0 :(得分:1)
我的猜测是你需要像...这样的东西。
SELECT ?article ?name WHERE {
?article rdf:type bench:Article .
?article dc:creator ?author .
?author foaf:name ?name .
FILTER ( ?article = <ARTICLE_URI_1> || ?article = <ARTICLE_URI_2> || ...
... || ?article = <ARTICLE_URI_5>)
}
使用要匹配的文章URI创建过滤器将返回五行,而不是一行,其中包含五个名称,我认为这些名称将是您的查询返回的内容。同样重要的是检索文章URI,以便您能够追踪文章和名称。
此外,您的查询未按预期使用SPARQL“连接”,您有三个独立的孤立模式块,最终可能会根据数据结构引发组合爆炸。
修改:加入问题中的查询分析
该查询的连接将产生最可能不一致的结果。但最优化的执行方式是从最严格的模式开始。所以一个可行的方法可能是:
通过应用?article1
和?article2
?article1 rdf:type bench:Article .
和?article2 rdf:type bench:Article .
从article1
和?article2
移除不在同一?journal
内的所有值。这是由于模式?article1 swrc:journal ?journal .
和?article2 swrc:journal ?journal .
分别替换?article1
和?article2
上的?article1 dc:creator ?author1 .
和?article2 dc:creator ?author2
的值,以获取?author1
和?author2
。
执行同等步骤以获取?name1
?name2
。
选择变量?name1
?name2
的笛卡尔积,因为它们未加入。
最重要的是,您的问题的答案是:是的,输出是根据连接变量产生的。大多数时候也通过在后续模式上替换值来执行。优化通常基于最严格的模式进行,并尽快替代。
答案 1 :(得分:1)
我不太确定,你想做什么。您是否正在实施SPARQL查询评估程序并且结果不正确?
无论如何,是的,可以使用连接执行此查询。部分加入,我不知道你的意思。这里的所有连接都是正常的等值连接。一个有效的连接顺序是:
?article1 rdf:type bench:Article
与?article1 dc:creator ?author1
(在?article1上)?author1 foaf:name ?name1
(在?author1上)?article1 swrc:journal ?journal
(在?article1上)?article2 swrc:journal ?journal
(on?journal)?article2 rdf:type bench:Article
(on?article2)?article2 dc:creator ?author2
(on?article2)?author2 foaf:name ?name2
(在?author2上)这可能不是最好的连接顺序,当然,它还取决于所使用的实际连接算法。
您还可以查看其他三重商店对查询的处理方式。例如,在Sesame中,在准备查询后,您可以通过调用SailQuery.getParsedQuery().getTupleExpr()
来检查查询计划。