是否可以保证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>
并获取中间关系的对象,而无需使用过滤编写非常慢的嵌套查询。
答案 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
模式匹配。