我正在检查一个在我的系统上运行太慢的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秒的时间吗?我是不是遗漏了什么?
发布于 2019-10-11 18:56:36
根据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'
}然后,您将消除没有共享变量的子查询之间令人讨厌的笛卡尔乘积,查询优化器可能会提早推动一些复杂的业务逻辑优化。
https://stackoverflow.com/questions/58232733
复制相似问题