【发布时间】:2016-04-15 18:38:50
【问题描述】:
在许多 SPARQL 系统中,您可以通过以图形模式重新排列三元组来优化查询。在其他情况下,您不能(查询引擎使用自己的一些启发式方法对其进行优化)
在 Jena 中,您可以通过在查询的早期放置最限制结果集的三重模式来优化查询(并确保始终提及一些已经绑定的变量)。在其他查询引擎中,此策略不起作用(因为它们处理查询的方式不同)
显然,Marklogic SPARQL 对三元组模式的排序很敏感(我重新安排了一些查询,发现它们会更快或更慢,多达 10 倍)。但是我找不到任何韵律或理由来使序列变得更快或更慢。我在 Jena 中成功使用的启发式方法不适用于 MarkLogic。
我已经搜索并查看了 MarkLogic 文档,但没有找到任何关于此的建议。是否有任何 MarkLogic 查询引擎编写者对此进行了注释?
【问题讨论】:
-
“在许多 SPARQL 系统中,您可以通过在图形模式中重新排列三元组来优化您的查询。”如果是真的,这实际上有点令人惊讶,因为它们应该是等价的。您是否发现了任何特定模式(例如,将匹配较少的三元组放在前面会产生更快的结果)?
-
SPARQL 中的唯一要求是无论查询中的顺序如何,结果都是相同的。性能是一个完全不同的问题。
-
大多数 Apache Jena 存储层都会进行某种部分重新排序(取决于版本);虽然很轻。如果部分重新排序有两个相同重要性的三元组模式,它将按照给定的顺序保留它们。
-
斯科特完全正确。但只是为了回答约书亚的问题,这里有一个简单的例子。我正在通过 FIBO 运行它。这个查询很慢(需要几秒钟): SELECT * WHERE { ?s a owl:Class 。 ?p 一只猫头鹰:ObjectProperty。 ?p rdfs:域 ?s 。这个查询很快(眨眼间): SELECT * WHERE { ?s a owl:Class 。 ?p rdfs:域 ?s 。 ?p 一只猫头鹰:ObjectProperty。它从不引入新变量(开始时除外);这会产生巨大的差异(跨产品和文件管理器与简单连接)
-
我试图排版最后一条消息,但它删除了我所有的换行符。我不知道如何解决这个问题。
标签: optimization sparql marklogic