我正在运行具有任意长度的属性路径的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。*
答案 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的值。