我很难理解扩展何时在OrientDB中运行。我对扩展应用于RID的理解是它返回文档(及其所有字段)http://orientdb.com/docs/2.1/SQL-Functions.html#expand
我有时无法将扩展应用于RID。
我将在此处创建一些示例数据,并提供我的问题示例。样本数据是由" NEXT"连接起来的Person节点。边缘。
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)
此代码段从具有ident 5的节点中找到遍历,直到它到达Alice。它返回一行,其中包含两个RID的集合:Laura的RID(ident 5)和Mike的rID(ident 15),因为Mike后面跟着一个Alice。
select $a
let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
如果我将展开应用于$a
,我会得到一个包含两行的结果表,其中包含这两个记录的详细信息。我不知道这是由于expand
集合(很快会被弃用而不是unwind
?),还是expand
对RID或两者兼而有之。
select expand($a)
let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
如果我放松$a
,我会得到一个包含两行的结果表,其中包含这两条记录的RID。 (这对我来说很有意义)
select $a
let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
unwind $a
如果我{3}中的expand
unwind
,我会得到与2相同的结果,这表明2解开并展开了人物节点
select expand($a)
let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
unwind $a
我可以选择1返回的RID集合中的最后一个RID。这给了一个包含1行的表,其中包含RID,这是Alice之前的最后一个人。
select last($a)
let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
如果我展开该结果,我会得到0行。这实际上不是我所期望的 - 我希望在第5部分中返回的记录详细信息的扩展记录详细信息中获得一行
select expand(last($a))
let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
有人能否解释为什么第6部分中的扩展不会扩展last($a)
返回的RID?
此外,如果有人确切知道第2部分中发生了什么 - 扩展的两个定义是否同时应用 - 这将有所帮助。
修改
奇怪的是,这个代码片段似乎做了我想要的第6点,但我不知道为什么。认为它可能引发某人对于正在发生的事情的记忆(我的问题是要理解为什么有些事情有效,有些事情没有,而不是得到任何有效的查询如果不幸的是,发现这个工作片段并没有关闭这个问题。)
select expand(last($a))
from (select from Person where ident = 5)
let $a = (traverse out('NEXT') from $current while name <> 'Alice')
答案 0 :(得分:3)
1)Traverse返回它访问的所有记录并符合while子句。在这种情况下,这只是2条记录。
2)展开收集&#39;集合中的所有rid。并返回这些记录,实际上处理包含该集合的查询。实际上,我只是发现他们正在弃用扩展以放松,我不确定为什么因为它们似乎有两个不同的用途。展开更像是RDBMS中的JOIN。
3)你没有取消任何结果,所以看起来你只得到$ a&#39;的细胞&#39;每排,但实际上你什么都没得到,$ a。也许这会使更多的目的更清晰,select *, $a from (select from Person limit 1) let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice') unwind $a
4)展开时,替换原始查询,所以你最终得到的就是扩展字段中的记录。
5)是的。
6)我认为你发现了一个错误。 first()
和last()
必须返回文本或其他内容,而不是指针。以下复制expand(first($a))
并起作用,因此我推测出一个错误; select expand($a[0]) let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')