【发布时间】:2015-10-26 12:03:36
【问题描述】:
我正在尝试遍历一些节点,我想在到达最远的节点符合特定条件时停止遍历。
我的数据是一些顺序连接的节点 - 这里有一个示例数据创建脚本(请注意,这与我的真实数据相比已大大简化,只是为了说明问题):
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 语句 - 我真的不了解范围是如何工作的,哪些对象存在于查询的哪些阶段.如果有人知道除了官方文档之外的任何好的文档,因为我已经阅读了这些文档,但我仍然没有得到它。
因此,任何有关如何回答此问题的有用提示,或在哪里可以找到有关如何编写此类查询的更多信息都会非常有用。
【问题讨论】:
标签: orientdb