Jena中适用于任意长度

时间:2016-05-14 11:13:13

标签: sparql rdf jena sesame

我正在运行具有任意长度的属性路径的SPARQL 1.1查询。 我可以在Sesame Sail Repository中非常有效地运行这些查询。然而,它们在Jena中使用Dataset(从Graph创建)或Model(TDB)运行得非常慢。

除了TDB或Graph之外,Jena还有其他可能吗?

实施例: 对于60 MB的n3 rdf文件,大约600,000三元组和以下查询:

SELECT ?x ?y {
 ?x <http://relationship.com/wasRevisionOf>+ ?y .
 ?x <http://relationship.com/wasGeneratedBy>/<http://relationship.com/wasAssociatedWith> ?z1 .
  ?y <http://relationship.com/wasGeneratedBy>/<http://relationship.com/wasAssociatedWith> ?z2 .
  FILTER(?z1 = ?z2  && ?x=<http://article.com/524910968> && ?y=<http://article.com/524753791>) 
} LIMIT 3

使用Jena TDB执行此查询需要14秒,JENA Graph需要38秒,而在Sesame Sail Repository Memory Store中只需要100-150 ms。*

  • 这个100-150毫秒适用于从1mb到200mb的每个文件大小,所需的三元组都包含在所有文件中。

1 个答案:

答案 0 :(得分:1)

虽然我建议你尝试使用TDB来利用基于磁盘的索引,但我要指出的一些事情可以帮助任何SPARQL引擎做得更好。在您的查询中,您有一个过滤器,其中包含一些相当简单的条件。一个可能的问题是概念上过滤器表示要获得可能的结果,然后将其修剪下来。现在,对于简单的条件,一个好的优化器可能会识别可以在查询期间应用的过滤器,以防止过多的工作。

在这种情况下,当您只使用一个变量而不是两个变量时,您需要?z1 =?z2 。您还可以使用一些过滤器为?x ?y 设置指定值,只需使用该值或块。希望这不会有任何区别,但请考虑一些重写:

select ?x ?y {
  values (?x ?y) { (<...> <...>) }
  ?z ^(:wasGeneratedBy/:wasAssociatedWith) ?x, ?y .
  ?x :wasRevisionOf+ ?y .
}
limit 3

一般来说(但不一定在你的情况下)可能有帮助的另一件事是,按照措辞,搜索可以天真地从一个?z值开始执行,找到?x和?y的值,以及然后检查?x和?y之间是否有合适的路径。但是由于?x和?y可以按任意顺序匹配,并且修订路径可能只在一个方向上进行,因此在子查询中首先查找合适的?x?y对然后找到?z值是有意义的。外部查询。这可能与你的情况无关,因为你从一开始就修正了?x和?y的值。