【问题标题】:OrientDB query second level of relationship keeping the intermediate idOrientDB查询二级关系保持中间id
【发布时间】:2015-03-19 14:38:24
【问题描述】:

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

这种关系可以这样表示:

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

对于用户 1,我想获得所有用户 3(2 条边的距离),但我想保留所有用户 2 的摆脱。方向不重要(会使用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 类的对象和来自中间 User 的摆脱)

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

从第二级查找顶点的查询如下:select expend(both('edge').both('edge')) from #10:2(当然查询可以通过设置函数和其他条件进行优化,以防输出用户的相互关系)。对于这个输出,我想看到一个额外的字段(属性/列,无论你想怎么称呼它),我可以在其中看到这种关系的中间顶点。

希望有人可以帮助我,告诉我您是否需要更多信息,或者如果您不明白某些内容。谢谢。


更新:

我发现了它应该如何完成,但它不起作用(我相信这是某种错误,报告了它,我现在正在等待答案)。

应该工作的查询看起来像这样:

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

当然查询可以优化(少子查询),但是为了逻辑,我这样表述。

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

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

【问题讨论】:

    标签: orientdb


    【解决方案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 )
    

    【讨论】:

    • Y,但是这个查询的问题是它不能被扩展,因为投影不允许扩展和展平运算符。所以我的问题是,你将如何扩展第二个both()。或者更好,你将如何修复:select @rid, expand(both('SomeEdge')) from (select expand(both('SomeEdge')) from #12:0 )
    • 也许你在谈论this issue。我试过了,但没有找到任何解决方法。
    • 感谢 vito 的回答。还有一件事:为什么我不应该放弃 OrientDB 而选择 Neo4j 呢?在我看来,东方仍然缺乏一些功能并且有一些错误。
    • 我认为这个问题没有正确答案。见Curtis's presentation :)
    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多