【问题标题】:Slow SparQL query when joining two sets of URIs连接两组 URI 时 SparQL 查询速度慢
【发布时间】:2019-10-04 08:36:48
【问题描述】:

我正在检查一个在我的系统上运行太慢的 SparQL 查询。非常简化,查询如下:

# The whole query takes ~20 seconds
SELECT ?baseUri_s1 {

    # This takes ~1 second and returns 3000 results
    { SELECT ?baseUri_s1 {
      # Here goes some more complex business logic
      ?baseUri_s1 myOntology:hasProperty1 'myProperty1'
    } }

    # This takes ~0.1 seconds and returns 1 result
    { SELECT ?baseUri_s2 {
      # Here goes some more complex business logic
      ?baseUri_s2 myOntology:hasProperty2 'myProperty2'
    } }

    FILTER (?baseUri_s1 = ?baseUri_s2)
}

因此,如果两个内部选择每个花费不到 1 秒...加入 3000 个 URI 的列表和另一个 URI 的列表是否可能花费超过 18 秒?我错过了什么吗?

【问题讨论】:

  • 为什么要使用 2 个子查询,而不是对两个三重模式使用相同的变量? SELECT ?s { ?s1 myOntology:hasProperty1 'myProperty1' . ?s1 myOntology:hasProperty2 'myProperty2' } - 但是,如果两个子查询都很复杂,可能需要一些时间。问题是每个子查询已经花费了多少时间。事实上,我们既不知道您的数据,也不知道复杂的查询,也不知道您运行三重存储的服务器
  • 这两个子查询每个都需要不到一秒钟的时间,因此如果删除“FILTER”行,整个事情将在大约 1.5 秒内返回。子查询返回 3000 和 1 个结果,所以从那时起,它基本上是关于加入两个 URI 列表......而最后一部分仅需要 15 秒。
  • 能否请您在 FactForge 上提供一个示例?
  • 如果只在每个子查询中返回相同的变量名,即不使用过滤器,会发生什么?
  • 同样的情况,仍然需要 18-20 秒

标签: sparql graphdb


【解决方案1】:

根据 SPARQL 规范,每个子选择都将独立执行。如果第一个子选择返回 1'000 个结果,第二个返回 300 个结果,则两个数据集之间的笛卡尔积将为 300'000。比较 300'00 可能要慢得多。

为什么不简单地执行查询:

# The whole query takes ~20 seconds
SELECT ?baseUri_s1 {

    # Here goes some more complex business logic query 1
    ?baseUri_s myOntology:hasProperty1 'myProperty1'

    # Here goes some more complex business logic query 2
    ?baseUri_s myOntology:hasProperty2 'myProperty2'
}

然后,您将在没有共享变量的情况下消除子查询之间令人讨厌的笛卡尔积,并且查询优化器可能会更早地推动一些复杂的业务逻辑优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2012-11-11
    相关资源
    最近更新 更多