耶拿的适当存储库,用于 属性 任意长度的路径

Appropriate repositories in Jena for property paths with arbitrary lengths

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

Jena除了TDB或者Graph还有其他的可能性吗?

示例: 对于一个 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 毫秒。*

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

在这种情况下,您要求 ?z1 = ?z2 时您可以简单地使用一个变量而不是两个变量。当您可以简单地使用值或 块。希望这不会产生任何影响,但请考虑按照以下思路进行一些重写:

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 的值。