gpt4 book ai didi

orientdb - 在 orientdb 中对 RID 和集合使用 expand

转载 作者:行者123 更新时间:2023-12-01 13:49:01 26 4
gpt4 key购买 nike

我很难理解 expand 何时会在 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)
  1. 此代码片段查找从标识为 5 的节点开始的遍历,直到遇到 Alice。它返回包含两个 RID 集合的一行:Laura 的 RID(身份 5)和 Mike 的 RID(身份 15),因为 Mike 后面跟着一个 Alice。

    select $a 
    let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
  2. 如果我对 $a 应用扩展,我会得到一个包含两行的结果表,其中包含这两条记录的详细信息。我不知道这是由于集合上的 expand(即将被弃用,取而代之的是 unwind?),还是 RID 上的 expand或两者兼而有之。

    select expand($a) 
    let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
  3. 如果我展开 $a,我会得到一个包含两行的结果表,其中包含这两条记录的 RID。 (这对我来说很有意义)

    select $a
    let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
    unwind $a
  4. 如果我从 3 展开 unwind,我得到与 2 相同的结果,这确实表明 2 展开并展开了 People 节点

    select expand($a)
    let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
    unwind $a
  5. 我可以在 1 返回的 RID 集合中选择最后一个 RID。这会给我一个包含 1 行的表,其中包含在 Alice 之前的最后一个 Person 的 RID。

    select last($a)
    let $a = (traverse out('NEXT') from (select from Person where ident = 5) while name <> 'Alice')
  6. 如果我展开该结果,我得到 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')

最佳答案

1) Traverse 返回它访问的所有符合 while 子句的记录。在本例中,只有 2 条记录。

2) Expand 获取“集合”中的所有 rids 并返回这些记录,实际上处理包含该集合的查询。实际上,我只是刚刚发现他们不赞成使用 expand for unwind,我不确定为什么,因为它们似乎有两种不同的用途。 Unwind 更像是 RDBMS 中的 JOIN。

3) 您已经将结果展开为空,所以看起来您每行只得到 $a“单元格”,但实际上您什么也得不到,$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')

关于orientdb - 在 orientdb 中对 RID 和集合使用 expand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33364697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com