orientdb遍历节点上的条件

orientdb遍历节点上的条件,orientdb,Orientdb,我正在尝试遍历一些节点,我希望在到达的最远节点与特定条件匹配时停止遍历 我的数据是一些顺序连接的节点-这里有一个示例数据创建脚本请注意,这与我的实际数据相比简化了很多,只是为了说明问题: create database plocal:people create class Person extends V create property Person.name string create property Person.age float create property Person.ident

我正在尝试遍历一些节点,我希望在到达的最远节点与特定条件匹配时停止遍历

我的数据是一些顺序连接的节点-这里有一个示例数据创建脚本请注意,这与我的实际数据相比简化了很多,只是为了说明问题:

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”是返回序列中的最后一个节点

为此,我假设我需要将遍历存储在一个对象中,并在返回之前为该对象请求下一个遍历。我尝试了各种方法来在查询中间存储对象中的遍历,但我没有得到。下面是一个错误示例:

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语句——我真的不了解作用域是如何工作的,哪些对象存在于查询的哪个阶段。如果有人知道除了官方文件之外的任何好的文档,那将是非常有用的,因为我已经阅读了这些文档,但我仍然没有得到它

因此,任何关于如何回答这个问题的有用提示,或者在哪里可以找到关于如何编写此类查询的更多信息,都将非常有用。

我希望它能对您有所帮助

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)

谢谢-你知道工会是否保证保留订单?i、 e.$b是一条记录,$a是一组记录。我总是希望在生成的联合$c中$b出现在$c之后。我找不到任何文档可以保证甚至提到这一点,所以我不确定。我认为unionAll$c,$b在结果中把$b放在$c之后,这几乎有效,谢谢!你的答案真的帮助我更好地理解了语法。有一个小问题,如果我问它指向“Mike”的路径,它不会返回以“Mike”开头的路径的任何信息,请参见我最初描述中的Mike,16.3,8。我想我可以把你的结果和一个查询结合起来,找到一个起始节点是Mike的情况。
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"