orientdb遍历直到节点

时间:2015-10-26 12:03:37

标签: orientdb

我正在尝试遍历某些节点,并且我希望在最远的节点达到某个条件时停止遍历。

我的数据是一些顺序连接的节点 - 这里有一个示例数据创建脚本(注意这比我的真实数据大大简化,只是为了说明问题):

create database plocal:people
create class Person extends V
create property Person.name string
create property Person.age float
create property Person.ident integer


insert into Person(name,age,ident) VALUES ("Bob", 30.5, 1)
insert into Person(name,age,ident) VALUES ("Bob", 30.5, 2)
insert into Person(name,age,ident) VALUES   ("Carol", 20.3, 3)
insert into Person(name,age,ident) VALUES   ("Carol", 19, 4)
insert into Person(name,age,ident) VALUES   ("Laura", 75, 5)
insert into Person(name,age,ident) VALUES   ("Laura", 60.5, 6)
insert into Person(name,age,ident) VALUES   ("Laura", 46, 7)
insert into Person(name,age,ident) VALUES   ("Mike", 16.3, 8)
insert into Person(name,age,ident) VALUES   ("David", 86, 9)
insert into Person(name,age,ident) VALUES   ("Alice", 5, 10)
insert into Person(name,age,ident) VALUES   ("Nigel", 69, 11)
insert into Person(name,age,ident) VALUES   ("Carol", 60, 12)
insert into Person(name,age,ident) VALUES   ("Mike", 16.3, 13)
insert into Person(name,age,ident) VALUES   ("Alice", 5, 14)
insert into Person(name,age,ident) VALUES   ("Mike", 16.3, 15)

create class NEXT extends E

create edge NEXT from (select from Person where ident = 1) to (select from Person where ident = 3)
create edge NEXT from (select from Person where ident = 2) to (select from Person where ident = 4)
create edge NEXT from (select from Person where ident = 8) to (select from Person where ident = 12)
create edge NEXT from (select from Person where ident = 5) to (select from Person where ident = 15)
create edge NEXT from (select from Person where ident = 15) to (select from Person where ident = 14)
create edge NEXT from (select from Person where ident = 7) to (select from Person where ident = 13)
create edge NEXT from (select from Person where ident = 13) to (select from Person where ident = 10)

让我们将序列定义为从没有传入链接的节点(起始节点)遍历节点。我正在尝试编写一个查询,它将返回所有节点序列,直到在遍历中遇到特定名称的第一次出现。假设具体名称是“Mike”。因此,对于这些数据,我希望找到以下序列:

("Laura", 75, 5) -> ("Mike", 16.3, 15),
("Laura", 46, 7) -> ("Mike", 16.3, 13),
("Mike", 16.3, 8)

我可以在'Mike'之前获取从特定节点到节点的序列。以下查询返回记录(“Laura”,75,5),因为该记录之后的记录名称为“Mike”

traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Mike'

以下查询返回两行,一行记录(“Laura”,75,5),另一行记录(“Mike”,16.3,15),作为Mike名字'Alice'之后的记录。

traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice'

我有两个问题 - 首先我想要包含与序列中的条件匹配的节点(即,在检查名为'Mike'的人时,我希望'Mike'成为最终节点在返回的序列中)

为此,我假设我需要将遍历存储在一个对象中,并在返回之前再为该对象请求一个out-Next。我已经尝试了各种方法将遍历存储在查询中间的对象中,但我只是没有得到它。这是一个例子(哪些错误):

select from (
  select $seq  from  
    (select from Person where ident = 5)
    let $seq = traverse out('NEXT') from $current while name <> 'Alice'        
    <... here append the next node ...> 
  )

其次,这个查询只是从一个节点开始 - 我想从所有起始节点开始,并返回一个以'Mike'结尾的序列,只要有一个节点。我希望一旦我可以将遍历存储在一个对象中,那么从多个起点而不是一个起点开始应该是相对简单的。

(当然,此特定查询的另一个选项是查找符合特定条件的所有节点(例如name ='Mike')并从那些​​节点向后工作,但我真的希望看到它在我最初描述的方式,因为我以后需要更多的一般方法。)

我怀疑我的很多问题是我真的很难弄清楚如何在OrientDB中使用let语句 - 我真的不明白范围是如何工作的,哪些对象存在于查询的哪个阶段。如果有人知道任何好的文档,除了官方文档之外,因为我读过这些文档并且我还没有得到它。

因此,任何有关如何回答此问题的有用提示,或者在何处找到有关如何编写此类查询的更多信息都非常有用。

2 个答案:

答案 0 :(得分:1)

我希望它可以帮到你

select expand($c) let $b=(select expand(out("NEXT")[name="Alice"]) from (select expand(last($a)) from (select from Person where ident = 5)
let $a = (traverse out('NEXT') from $current while name <> 'Alice')) limit 1), $c=unionAll($a,$b)

答案 1 :(得分:1)

select name, list from (select name,$c.name as list from Person 
let $b=( select expand(out("NEXT")[name="Alice"]) from (select expand(last($a)) from $parent.$current 
let $a = (traverse out('NEXT') from $current while name <> 'Alice')) limit 1), 
$c=unionAll($a,$b) where in("NEXT").size()=0) 
where list contains "Alice"