1

是否可以保证 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]。在耶拿尝试这个时,我得到一致但随机排序的结果。

或者,如果我可以在传递步行中取回父母和孩子,这样我就可以在外面重新排序它会很好,但我不知道如何绑定?parent ex:contains* <http://example.com/step3>和取回中间关系的对象而不编写一个非常慢的带有过滤的嵌套查询。

4

3 回答 3

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 |
------------
于 2017-04-05T12:44:28.397 回答
1

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

否(SPARQL 1.1 标准未定义顺序)

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

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

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

于 2017-04-05T10:20:55.833 回答
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模式匹配。

于 2017-04-04T23:10:52.337 回答