在传递SPARQL查询中排序

时间:2017-04-04 21:53:02

标签: sparql jena fuseki transitive-closure

是否可以保证SPARQL中传递查询的结果按照它们的行进顺序返回?

所以,给出一些简单的数据:

<http://example.com/step0> ex:contains <http://example.com/step1>
<http://example.com/step1> ex:contains <http://example.com/step2>
<http://example.com/step2> ex:contains <http://example.com/step3>

(实际上这种关系可能会重复很多次)

查询(使用sparql 1.1):

SELECT ?parent
WHERE {
    ?parent ex:contains* <http://example.com/step3>
}

这样你总能回来[step0,step1,step2]。在jena中尝试这个时,我会得到一致但随机排列的结果。

或者,如果我可以在传递步行中找回父母和孩子,以便我可以在外面重新排序它,但我不知道如何同时绑定?parent ex:contains* <http://example.com/step3>并获取中间关系的对象,而无需使用过滤编写非常慢的嵌套查询。

3 个答案:

答案 0 :(得分:3)

对于简单的线性路径,您可以使用跳数作为排序的度量:

PREFIX  ex:   <http://example.com/>

SELECT  ?start
WHERE
  { ?start (ex:contains)+ ?mid .
    ?mid (ex:contains)* ex:step3
  }
GROUP BY ?start
ORDER BY DESC(COUNT(?mid))

输出:

------------
| start    |
============
| ex:step0 |
| ex:step1 |
| ex:step2 |
------------

答案 1 :(得分:1)

  

是否可以保证传递查询的结果   SPARQL按照他们走的顺序回来了?

否(SPARQL 1.1标准未定义订单)

这里,固定对象和数据是线性路径的事实恰好意味着存在自然的步行顺序。

由于Apache Jena SPARQL执行是确定性的(在这种情况下),它只会以某种顺序出现,因为内部结果集合保留了顺序。并非所有Jena版本都这样做 - 它随着时间的推移而发生了变化。

对于其他非线性路径,没有什么是确定的。使用哈希映射存储数据。

答案 2 :(得分:0)

根据您的数据示例,请尝试:

SELECT ?parent ?child ?subchid
WHERE {
    ?parent ex:contains <http://example.com/step3> .
    ?child ex:contains ?parent .
    OPTIONAL { ?subchild ex:contains ?child . }
}

如果并非所有ex:contains关系都是三个级别,您可能需要进行OPTIONAL模式匹配。