我想在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子句不会将单个值指向每个记录,而是将最后一个值与所有记录相关联(如我在示例中所述)。
也许我错了,这不是一个错误,如果有人知道它,希望你能帮助我。如果它是一个错误,我愿意接受解决问题的建议。谢谢。
答案 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
在这种情况下,你需要#12:2和#12:4,但保持#12:1和#12:3(中间体)。也许这个查询可以帮到你:
select @rid, both('SomeEdge') from (select expand(both('SomeEdge')) from #12:0 )