OrientDB查询保持中间id的第二级关系

时间:2015-03-19 14:38:24

标签: orientdb

我想在OrientDB图数据库中查询一个顶点来获取第二级顶点,保持在顶点id之间。

这种关系将表示为:

User <--edge--> User <--edge--> User
(1)             (2)             (3)

对于用户1,我想获得所有用户3(2个边缘的距离),但我想保留所有用户2 rid的结果。方向并不重要(将使用both()方法遍历)

一个例子:

#10:1 <--edge--> #10:2
#10:1 <--edge--> #10:3
#10:2 <--edge--> #10:4
#10:2 <--edge--> #10:5
#10:3 <--edge--> #10:6

对于上面的例子,#10:1的查询应该返回:(不知道如何更好地表示这个,但是查询应该从类User返回对象并从中间用户中删除<) / p>

User(#10:4), #10:2
User(#10:5), #10:2
User(#10:6), #10:3

从第二级查找顶点的查询看起来像:select expend(both('edge').both('edge')) from #10:2(当然,在输出用户的相互关系的情况下,可以使用set函数和其他条件优化查询)。对于这个输出,我想看到一个额外的字段(属性/列,无论你想要什么),我可以看到这种关系的顶点之间。

希望有人可以帮助我,告诉我你是否需要更多信息,或者你是否理解了什么。谢谢。


更新

我发现它应该怎么做,但它不起作用(我相信它是某种类型的错误,报告它,我现在正在等待答案)。

应该有效的查询,如下所示:

select *,$id from (select both('edge') from (select from (select both('edge') from <rid>) let $id = @rid))

当然,可以优化查询(减少子查询),但为了逻辑起见,我这样说了。

查询的问题在于,例如上面所述,所有$ id值都是#10:3,因为它是记录的最后一个值。 LET子句不会将单个值指向每个记录,而是将最后一个值与所有记录相关联(如我在示例中所述)。

也许我错了,这不是一个错误,如果有人知道它,希望你能帮助我。如果它是一个错误,我愿意接受解决问题的建议。谢谢。

1 个答案:

答案 0 :(得分:1)

create class User extends V

create vertex User set name = 'user0'       (#12:0)
create vertex User set name = 'user1'       (#12:1)
create vertex User set name = 'user2'       (#12:2)
create vertex User set name = 'user3'       (#12:3)
create vertex User set name = 'user4'       (#12:4)


create class SomeEdge extends E

create edge SomeEdge from #12:0 to #12:1
create edge SomeEdge from #12:1 to #12:2
create edge SomeEdge from #12:4 to #12:3
create edge SomeEdge from #12:3 to #12:0

enter image description here

在这种情况下,你需要#12:2和#12:4,但保持#12:1和#12:3(中间体)。也许这个查询可以帮到你:

select @rid, both('SomeEdge') from (select expand(both('SomeEdge')) from #12:0 )