Rdf 重复SPARQL子查询

Rdf 重复SPARQL子查询,rdf,sparql,semantic-web,Rdf,Sparql,Semantic Web,为了得到子查询结果的笛卡尔积,我复制了查询并将结果绑定到不同的变量。但是内部查询非常长,除了SELECT行之外,其他都是一样的。有没有办法简化这一点 我在下面添加了我的查询的简化版本。我实际上想做的是找出一系列事件中的时间表冲突。这些事件由子查询选择 SELECT ?a1 ?b1 ?a2 ?b2 WHERE { SELECT (?a AS ?a1) (?b AS ?b1) WHERE { # long query with ?a and ?b } SELECT (?a

为了得到子查询结果的笛卡尔积,我复制了查询并将结果绑定到不同的变量。但是内部查询非常长,除了
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)
}
选择a1?b1?a2?b2
在哪里{
选择(?a为a1)(?b为b1)
在哪里{
#带?a和?b的长查询
}
选择(?a为a2)(?b为b2)
在哪里{
#带?a和?b的长查询
}
过滤器(?a1<?a2)
}

您正在执行查询,并获得结果(两次):

第二点:

{ < x1, y1>, *< x2, y2 >*,    < x3, y3 >, ... }
{ < x1, y1>, < x2, y2 >, *< x3, y3 >*, ... and everything else ... }
把它放在一个数组或类似的数组中,循环获取项目
results[i],结果[j],其中i>j

,我认为这是正确的选择。我不认为有一种简单的方法可以得到任意查询的笛卡尔乘积。让服务器这样做有一个好处,那就是可以对结果进行流式处理,避免大量中间存储,如果您只是接受结果并自己计算笛卡尔积,这就是您可能需要的

不过,我要指出的是,根据您的特定查询,重写它以计算笛卡尔积的方式可能并不太困难。这取决于特定的查询,但是您可以使用对象列表表示法,并通过使用属性路径将变量移动到对象位置。例如,考虑一个查询,如:

?a :p/:q ?b
您可以利用这一事实,即它与表单的数据相匹配

X&rightarrow;py&rightarrow;q Z

要将查询重写为:

[] ^:p ?a ; :q ?b
现在,您可以使用逗号分隔的对象列表来匹配两组?a和?b:

[] ^:p ?a1, ?a2 ; :q ?b1, ?b2

当然,您不能在每个查询中都使用它,您可能仍然需要复制某些部分,例如筛选表达式,但它可能是一个可行的替代方法。

您能用?a和?b提供实际查询吗。我已经发布了一个答案,可能对您的特定情况有帮助,也可能没有帮助,但是知道特定的查询是什么会有所帮助。不幸的是,我无法发布实际的查询。谢谢你在回答中的建议!好的,您可以提供类似的查询吗?如果你能展示足够的内容,也许可以展示如何重写它。谢谢,但现在可以了。谢谢,这是一个好主意,可能是实践中最好的方法。您知道是否有任何SPARQL引擎能够执行您描述的优化吗?不知道,但是(纯粹猜测)这似乎不太可能,因为它需要发现子查询是相同的(有点棘手),我认为这种情况非常罕见。您真正需要的是一种让查询引擎更明确地知道子查询是否被重用的方法,例如临时表或显式的自交叉连接?无论哪种方式,这都超出了标准SPARQL。
?a :p/:q ?b
[] ^:p ?a ; :q ?b
[] ^:p ?a1, ?a2 ; :q ?b1, ?b2