在RDF上执行复杂连接

时间:2011-07-05 14:40:10

标签: join rdf sparql

我想执行以下查询:

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数据执行此查询,我想要遵循这种方法

  1. 我会找到所有常见的连接变量,例如:?article1,?article2,?author1,?author2,?journal。
  2. 我将执行部分连接的连接,因此将根据常用连接vraiables生成输出(输出文件的总数将为5)
  3. 现在我想对这5个输出文件执行SELECT操作{SELECT?name1?name2} ..
  4. 完成
  5. 现在我的困惑是它会产生完美的输出,就像正常连接一样,不是???? ..

2 个答案:

答案 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“连接”,您有三个独立的孤立模式块,最终可能会根据数据结构引发组合爆炸。

修改:加入问题中的查询分析

该查询的连接将产生最可能不一致的结果。但最优化的执行方式是从最严格的模式开始。所以一个可行的方法可能是:

  1. 通过应用?article1?article2

  2. 查找?article1 rdf:type bench:Article .?article2 rdf:type bench:Article .
  3. article1?article2移除不在同一?journal内的所有值。这是由于模式?article1 swrc:journal ?journal .?article2 swrc:journal ?journal .

  4. 分别替换?article1?article2上的?article1 dc:creator ?author1 .?article2 dc:creator ?author2的值,以获取?author1?author2

  5. 执行同等步骤以获取?name1 ?name2

  6. 选择变量?name1 ?name2的笛卡尔积,因为它们未加入。

  7. 最重要的是,您的问题的答案是:是的,输出是根据连接变量产生的。大多数时候也通过在后续模式上替换值来执行。优化通常基于最严格的模式进行,并尽快替代。

答案 1 :(得分:1)

我不太确定,你想做什么。您是否正在实施SPARQL查询评估程序并且结果不正确?

无论如何,是的,可以使用连接执行此查询。部分加入,我不知道你的意思。这里的所有连接都是正常的等值连接。一个有效的连接顺序是:

  1. 加入?article1 rdf:type bench:Article?article1 dc:creator ?author1(在?article1上)
  2. 将结果与?author1 foaf:name ?name1(在?author1上)
  3. 相关联
  4. 将结果与?article1 swrc:journal ?journal(在?article1上)
  5. 相关联
  6. 将结果与?article2 swrc:journal ?journal(on?journal)
  7. 相关联
  8. 将结果与?article2 rdf:type bench:Article(on?article2)
  9. 相关联
  10. 将结果与?article2 dc:creator ?author2(on?article2)
  11. 相关联
  12. 将结果与?author2 foaf:name ?name2(在?author2上)
  13. 相关联

    这可能不是最好的连接顺序,当然,它还取决于所使用的实际连接算法。

    您还可以查看其他三重商店对查询的处理方式。例如,在Sesame中,在准备查询后,您可以通过调用SailQuery.getParsedQuery().getTupleExpr()来检查查询计划。