可传递SPARQL查询中的排序

可传递SPARQL查询中的排序,sparql,jena,fuseki,transitive-closure,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 <

是否有可能保证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>
}
这样你就可以一直回来[第0步,第1步,第2步]。在jena尝试这一点时,我得到了一致但随机排列的结果


或者,如果我可以在传递遍历中同时返回父对象和子对象,这样我就可以在外部重新排序,但我不知道如何绑定?parent ex:contains*并返回中间关系的对象,而无需编写带有筛选的非常慢的嵌套查询。

给出您的数据示例,请尝试:

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

如果并非所有ex:contains关系都达到三个级别,则可能需要进行可选的模式匹配。

给出数据示例,请尝试:

SELECT ?parent ?child ?subchid
WHERE {
    ?parent ex:contains <http://example.com/step3> .
    ?child ex:contains ?parent .
    OPTIONAL { ?subchild ex:contains ?child . }
}
如果并非所有ex:contains关系都达到三个级别,则可能需要进行可选的模式匹配

是否可以保证可传递查询的结果在 你能按他们走路的顺序回来吗

否SPARQL 1.1标准未定义顺序

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

由于ApacheJenaSparQL的执行在本例中是确定性的,因此它将以某种顺序出现,因为内部结果集合保持顺序。并不是所有的耶拿版本都这样做——它随着时间的推移而改变

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

是否可以保证可传递查询的结果在 你能按他们走路的顺序回来吗

否SPARQL 1.1标准未定义顺序

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

由于ApacheJenaSparQL的执行在本例中是确定性的,因此它将以某种顺序出现,因为内部结果集合保持顺序。并不是所有的耶拿版本都这样做——它随着时间的推移而改变


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

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

前缀ex: 选择?开始 哪里 {?start ex:包含+?mid。 ?中间防爆:包含*防爆:步骤3 } 分组?开始 按DESCCOUNT订购?中 输出:

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

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

前缀ex: 选择?开始 哪里 {?start ex:包含+?mid。 ?中间防爆:包含*防爆:步骤3 } 分组?开始 按DESCCOUNT订购?中 输出:

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

您的查询只返回一个结果,即http://example.com/step2 因此,我不明白你为什么说它在耶拿有效,但结果是随机排列的。我看不出你已经在这里解决了传递性的概念,因为没有像ex:contains*这样的属性路径被使用。很抱歉,我遗漏了问题中最重要的一个字符。它应该是ex:contains*,我已经更新了问题您的查询只返回一个结果http://example.com/step2 因此,我不明白你为什么说它在耶拿有效,但结果是随机排列的。我看不出你已经在这里解决了传递性的概念,因为没有像ex:contains*这样的属性路径被使用。很抱歉,我遗漏了问题中最重要的一个字符。它应该是ex:contains*,我已经更新了问题谢谢你的回答,我不小心漏掉了*on ex:contains*,这使得查询可以传递。我已经更新了问题。在我的例子中,传递关系的深度是无限的。我需要看看可选是如何使用的,我在其他答案中看到过它,但给人的印象是它是一种特定于高手的语法。有关OP中的更新,请参阅@ASKW的回复。作为使用OPTIONAL的示例,我编辑了上面的响应。感谢您的回答,我无意中删除了*on ex:contains*,这使查询具有传递性。我已经更新了问题。在我的例子中,传递关系的深度是无限的。我需要看看可选是如何使用的,我在其他答案中看到过它,但给人的印象是它是一种特定于高手的语法。有关OP中的更新,请参阅@ASKW的回复。作为一个使用OPTIONAL的例子,我编辑了上面的响应。经过一些测试,看起来这是可行的,谢谢!唯一的问题是,当图形的大小呈线性时,性能会显著下降。但是,如果我将WHERE子句中的条件反转为{?mid-ex:contains*ex:step3。?start-ex:contains+?mid},则顺序仍然正确,但性能似乎不会随着填充的图形而下降
不再它仍然比原始查询慢大约2-3倍,但与必须执行多个查询相比,这是可以接受的。经过一些测试,看起来这是可行的,谢谢!唯一的问题是,当图形的大小呈线性时,性能会显著下降。但是,如果我将WHERE子句中的条件反转为{?mid-ex:contains*ex:step3。?start-ex:contains+?mid},则顺序仍然正确,但性能似乎不再随着填充的图形而下降。它仍然比原始查询慢约2-3倍,但与必须执行多个查询相比,这是可以接受的。谢谢,如果传递查询有任何排序机制,我很难找到任何明确提到的内容,因此最好让它确认这一点。谢谢,如果传递查询有任何排序机制,我很难找到任何明确提到的内容,所以最好让它确认这一点。