如何在RDF中存储具有有序子级的树?如何在SPARQL中遍历这样的结构?

如何在RDF中存储具有有序子级的树?如何在SPARQL中遍历这样的结构?,sparql,rdf,virtuoso,Sparql,Rdf,Virtuoso,如何在RDF中存储具有有序子级的树 输入: 1. Title 1 Some text 1. 2. Title 2 2.1. Title 2.1 Some text under title 2.1. 2.2. Title 2.2 Some text under title 2.2. 1.标题1 一些文本1。 2.标题2 2.1. 标题2.1 标题2.1下的一些文本。 2.2. 标题2.2 标题2.2下的一些文本。 标题可以是任意的,不一定包含编号 如何在一个查询中返回所

如何在RDF中存储具有有序子级的树

输入:

1. Title 1 Some text 1. 2. Title 2 2.1. Title 2.1 Some text under title 2.1. 2.2. Title 2.2 Some text under title 2.2. 1.标题1 一些文本1。 2.标题2 2.1. 标题2.1 标题2.1下的一些文本。 2.2. 标题2.2 标题2.2下的一些文本。 标题可以是任意的,不一定包含编号

如何在一个查询中返回所有仍按顺序排列的元素

期望输出:

|-----------+----------------------------+ | Title | Content | |-----------+----------------------------+ | Title 1 | Some text under title 1. | | Title 2 | | | Title 2.1 | Some text under title 2.1. | | Title 2.2 | Some text under title 2.2. | |-----------+----------------------------+ |-----------+----------------------------+ |标题|内容| |-----------+----------------------------+ |标题1 |标题1下的一些文本| |标题2 || |标题2.1 |标题2.1下的一些文本| |标题2.2 |标题2.2下的一些文本| |-----------+----------------------------+
编辑:“”没有回答我的问题。它讨论无序节点。我的问题是关于有序集合(列表列表)和按原始顺序取回元素的

您可以对示例数据建模如下:

ex:title1 a ex:Title ;
          rdfs:label "Title 1";
          rdfs:comment "some text under title 1".

ex:title2 a ex:Title ;
          rdfs:label "Title 2";
          rdfs:comment "some text under title 2".


ex:title21 a ex:Title ;
          rdfs:label "Title 2.1";
          rdfs:comment "some text under title 2.1".

ex:title22 a ex:Title ;
          rdfs:label "Title 2.2";
          rdfs:comment "some text under title 2.2".
ex:title2 ex:subtitles (ex:title21 ex:title22).
ex:titleCollection ex:subtitles (ex:title1 ex:title2) .
然后,查询所有事物的顺序可以按标题进行非常基本的词汇排序:

select ?title ?content 
where {  
    [] ex:subtitles/rdf:rest*/rdf:first [ 
                      rdfs:label ?title ;
                      rdfs:comment ?content ] .
} 
order by ?title
结果:

Evaluating SPARQL query...
+-------------------------------------+-------------------------------------+
| title                               | content                             |
+-------------------------------------+-------------------------------------+
| "Title 1"                           | "some text under title 1"           |
| "Title 2"                           | "some text under title 2"           |
| "Title 2.1"                         | "some text under title 2.1"         |
| "Title 2.2"                         | "some text under title 2.2"         |
+-------------------------------------+-------------------------------------+
4 result(s) (4 ms)
如果您不想依赖实际的title属性来提供正确的排序,那么当然可以引入带有层次编号的显式排序属性,并在
order by
子句中使用该属性的值

选择1 您可以将RDF序列化为JSON-LD,并在e中编写简单的递归函数。GJavascript

var-nquads=`
_:b1。
_:b1 u2;:b2。
_:b1 u3;:b3。
_:b2“标题1”。
_:b2。
_:b2“标题1下的某些文本”。
_:b3 u3:b4。
_:b3。
_:b4 u3:b5。
_:b4。
_:b4“标题2下的某些文本”。
_:b4“标题2”。
_:b5 u3:b6。
_:b5 u7。
_:b6。
_:b6“标题2.1下的某些文本”。
_:b6“标题2.1”。
_:b7 u8。
_:b7。
_:b8。
_:b8“标题2.2下的某些文本”。
_:b8“标题2.2”。
`;
fromRDF(nqads,{格式:'application/nqads'},函数(err,doc){
打印(文档,“http://ex.com/titleCollection") 
});
功能打印(单据、id){
var what=get(doc,id)
变量标签=什么['http://www.w3.org/2000/01/rdf-schema#label']
var comment=what['http://www.w3.org/2000/01/rdf-schema#comment']
var subtitles=什么['http://ex.com/subtitles']
if(label)console.log(label[0]['@value'])
if(comment)console.log(comment[0]['@value'])
若有(字幕){
用于(字幕[0]['@list']的变量i)打印(文档,i['@id'])
}
}
函数get(doc,id){return doc.find((element)=>(element['@id']==id))}

RDF是一组三元组。您需要的是RDF列表。2) 查询可能与属性路径一起工作3)SPARQL不是一种图形遍历语言,因此,如果事情变得复杂,它可能会失败。也就是说,并不是所有的事情都可以在@JeenBroekstra的一个可查询的副本中完成。我已经用澄清更新了我的问题。更重要的是。深度是无限的吗?@StanislavKralin OpenLink高手尽管我很欣赏你的回答,但我认为按标题排序是欺骗。集合中的节点是否已排序?真的有必要引进新的房产吗?如果将某个分支移动到另一个父级,则更新此属性将是一件痛苦的事情。@teksisto您的问题中没有具体说明这一点-我必须自己完成实际的数据建模。您可以在sparql中执行一些技巧,如中所述,但要获得正确和性能,不仅是一个列表,而且是一个深度未知的列表树,似乎很复杂。就个人而言,我认为你最好通过多个查询,或者使用API,或者通过我在回答中概述的“作弊”来解决这个问题。我已经更新了我的问题。对不起,这是误导。我的问题是基于这样一个事实,即即使是关系数据库也可以使用嵌套集在一个查询中检索这样的结构。我认为SPARQL可以比关系数据库更好地处理图形数据。@teksisto这并不是说SPARQL无法检索到图形数据——它显然可以,只是不一定像您所期望的那样按顺序排序。问题是RDF集合不容易按顺序遍历,除非您使用特定的自定义函数。有些triplestore具有用于此目的的扩展函数。然而,在香草SPARQL中,这是一种痛苦。@teksisto,也许Jeen Broekstra的意思是Jena ARQ列表函数: