我正在检查一个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秒以上吗?我想念什么吗?
答案 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'
}
然后,您将消除没有共享变量的子查询之间令人讨厌的笛卡尔积,查询优化器可能会更早地推动一些复杂的业务逻辑优化。