OrientDB查询朋友的朋友更多信息和过滤

OrientDB query friend of friends with more information and filtering

简介:

嗨,

我有一个关于如何创建 OrientDB 查询的问题。 query应该得到friends of friends的所有顶点(相当于二级关系)+2之间的桥梁,之后query应该过滤一条边属性.[=13之后的记录=]

我是运行 OrientDB 1.7.4.

架构示例:

让我们举个例子,采用以下架构:

-> 用户是一个顶点,具有 属性 id (int)

-> Knows 是一个 Edge,具有 属性 类型(字符串)(假设这个 属性 有几个值:朋友、家人等)

我要找的关系是这样的:

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

我需要所有关系,无论它们的方向如何(即使方向对其他查询很重要)。

要获取所有二级用户(User3),像这样的查询就足够了:

select expand( set(both().both()) ) from <rid> 

问题:

现在,我有 2 个我无法解决的主要问题:

  1. 如果上面的查询 return 来自 class 用户 (User3) 的记录列表,我怎样才能获得用户 (User3) 和用户 (或 属性 id)来自关系中间的用户(见上文:User2)

  2. 如何过滤查询以仅通过具有特定 属性 的边遍历(或 select)。更具体地说,我希望第二个查询找到来自问题 1 但是朋友的朋友的用户:User <--knows(method='friend')--> User <--knows(method='friend')--> User.

按照vitorenesduarte的建议,我找到了答案。是的,我应该寻找边缘,过滤边缘,而不是从边缘中取出顶点,如下所示:

select expand( unionAll(inE('knows')[method='friend'].out, outE('knows')[method='friend'].in ) from <rid>

这个查询的问题是,我认为如果 OrientDB 有一个从边缘获取双向顶点的函数,它可以被优化,像这样:

bothE('knows')[method='friend'].both

但是 .both 功能不存在(至少在我使用的版本中,即 1.7.4)。如果有人对此有所了解,请发表评论。

你可以这样做:

TREVERSE * FROM (SELECT FROM User WHERE id == 1)
WHILE (@class == 'User') OR (@class == 'Knows' AND method == 'friend')

这将为您提供从 id = 1 的顶点开始的所有顶点和边。

如果你想停在2级,那么

TREVERSE * FROM (SELECT FROM User WHERE id == 1)
WHILE (@class == 'User') OR (@class == 'Knows' AND method == 'friend')
MAXDEPTH 2

如果你只想拥有顶点:

SELECT FROM (
    TREVERSE * FROM (SELECT FROM User WHERE id == 1)
    WHILE (@class == 'User') OR (@class == 'Knows' AND method == 'friend')
    MAXDEPTH 2
)
WHERE @class == 'User '

如果你正好需要知道从第一个人到最后一个人的路径,以及从id=1到第2层的所有可能路径。

SELECT $path FROM (
        TREVERSE * FROM (SELECT FROM User WHERE id == 1)
        WHILE (@class == 'User') OR (@class == 'Knows' AND method == 'friend')
        MAXDEPTH 2
    )

但是如果你有一个固定的深度,最好用 select 来做,试试这个:

SELECT bothE('Knows')[method='friend'].bothV() FROM User WHERE id = 1