为了获得子查询结果的笛卡尔积,我复制了查询并将结果绑定(bind)到不同的变量。但内部查询相当长,并且除了 SELECT
行之外完全相同。有没有办法简化这个?
我在下面添加了查询的简化版本。我实际上想做的是找到一组事件中的时间表冲突。事件由子查询选择。
SELECT ?a1 ?b1 ?a2 ?b2
WHERE {
SELECT (?a AS ?a1) (?b AS ?b1)
WHERE {
# long query with ?a and ?b
}
SELECT (?a AS ?a2) (?b AS ?b2)
WHERE {
# long query with ?a and ?b
}
FILTER (?a1 < ?a2)
}
最佳答案
您正在执行查询并获取结果(两次):
{ < x1, y1>, < x2, y2 >, < x3, y3 >, ... }
{ < x1, y1>, < x2, y2 >, < x3, y3 >, ... }
然后,您希望仅过滤那些第一组中的第一个值小于第二组中的第一个值的结果对。
现在结果的数量将快速增加,O(N^2)。无论如何,你真的不需要为此烦恼。假设(不失一般性)您按第一个值升序对结果进行排序。那么你的第一批结果(用 *
表示)是:
{ *< x1, y1>*, < x2, y2 >, < x3, y3 >, ... }
{ < x1, y1>, *< x2, y2 >*, *< x3, y3 >*, ... and everything else ... }
第二个:
{ < x1, y1>, *< x2, y2 >*, < x3, y3 >, ... }
{ < x1, y1>, < x2, y2 >, *< x3, y3 >*, ... and everything else ... }
等等等等
因此,您只需发出查询,就可以在空间和时间方面获得更好的结果:
SELECT ?a ?b
WHERE {
# long query with ?a and ?b
}
ORDER BY ?a # defaults to ASCending
将其放入数组或类似数组中,然后循环获取项目results[i], results[j],其中 i > j
。
关于rdf - 重复的 SPARQL 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26920311/