【发布时间】: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 秒