rdf - 重复的 SPARQL 子查询

标签 rdf sparql semantic-web

为了获得子查询结果的笛卡尔积,我复制了查询并将结果绑定(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/

相关文章:

html - XHTML 1.0 中的 <dl> 元素是否适合显示资源标签列表或订阅提要?

git - 如何在三重存储之上设置版本控制

rdf - 快速启动语义网的最佳 rdf 数据库

java - 耶拿 : Create a single Statement based on a String object

xml - 如何在 QName 中表示逗号(尤其是在 Turtle 文档中)

rdf - 按标题在 DBpedia 上进行强大的搜索

sparql - 在海龟或 RDF 中,我可以在符合条件的所有主题上添加谓词/宾语吗?

uri - 将 URI 分配给 RDF 资源

curl - 如何基于查询文件发送 SPARQL cURL 请求?

semantics - 可用于对文本进行语义分析的工具