【问题标题】:Optimizing SPARQL queries in MarkLogic在 MarkLogic 中优化 SPARQL 查询
【发布时间】: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


【解决方案1】:

优化级别给优化器一个提示,告诉它花费多少时间来寻找最佳查询计划。 任何优化器都会花费一些时间来寻找最佳计划,但必须在寻找该计划所花费的时间与使用最佳计划的好处之间取得平衡。我们大多数人在现实生活中都经历过这种权衡(!)

优化级别 1 表示“做一些工作以寻找最佳计划,但不要发疯”。级别 2 表示“做更多工作以找到最佳计划”。 0 级表示“按原样接受查询”。

对于大多数查询,级别 1 是合适的,这是默认设置。如果您有一个特别复杂的查询,请尝试第 2 级,看看花在寻找计划以加快查询速度上的额外时间是否真的能在整体查询时间上得到回报。如果您有非常简单的查询,请尝试 0 级。

【讨论】:

    【解决方案2】:

    我询问了 MarkLogic 内部 PM 和工程团队的专家。有人告诉我,“无论模式的顺序如何,您都应该获得相同的性能,因为我们有一个复杂的查询优化器。如果这不是真的,请提交一个错误。”了解您正在使用的特定版本的 MarkLogic、optimization level 和一些示例查询也很有用。

    【讨论】:

    • 文档没有说明优化级别的作用,只是说“0(关闭)、1 和 2 的级别被识别。默认为 1。”应该使用什么级别以及可以预期什么样的优化?
    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多