加入两组URI时SparQL查询缓慢

时间:2019-10-04 08:36:48

标签: sparql graphdb

我正在检查一个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秒以上吗?我想念什么吗?

1 个答案:

答案 0 :(得分: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'
}

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