【问题标题】:Duplicated SPARQL subquery重复的 SPARQL 子查询
【发布时间】:2014-11-13 23:20:26
【问题描述】:

为了获得子查询结果的笛卡尔积,我复制了查询并将结果绑定到不同的变量。但是内部查询很长,除了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)
}

【问题讨论】:

  • 您能否提供带有 ?a 和 ?b 的实际查询。我发布的答案可能对您的特定情况有帮助,也可能没有帮助,但知道特定查询是什么会有所帮助。
  • 不幸的是,我无法发布实际查询。不过,感谢您在回答中提出的建议!
  • 好的,你能提供类似的查询吗?如果你能展示的足够多,也许可以展示它是如何被重写的。
  • 谢谢,但现在很好。

标签: rdf sparql semantic-web


【解决方案1】:

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

{ < 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] where i &gt; j

【讨论】:

  • 谢谢,这是个好主意,而且可能是实践中最好的方法。您知道是否有任何 SPARQL 引擎能够执行您所描述的优化?
  • 不知道,但是(纯粹猜测)这似乎不太可能,因为它需要发现子查询是相同的(有点棘手),我想这有助于相当不寻常的情况。您真正需要的是一种使查询引擎更明确地重用子查询的方法,例如临时表或显式自交叉连接?无论哪种方式,这都超出了标准 SPARQL。
【解决方案2】:

user205512's answer 是正确的,我想。我认为没有一种简单的方法可以获取任意查询的笛卡尔积。让服务器来做这件事有一个好处,那就是可以流式传输结果,避免大量的中间存储,如果您只是接受结果并自己计算笛卡尔积,这可能是您需要的。

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

?a :p/:q ?b

您可以利用它匹配表单数据的事实

X &rightarrow;p Y &rightarrow;q Z

将查询重写为:

[] ^:p ?a ; :q ?b

现在您可以使用逗号分隔的对象列表匹配两组 ?a 和 ?b:

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

当然,您不能将它用于每个查询,并且您可能仍需要复制某些部分,例如过滤器表达式,但它可能是一个可行的替代方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多