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

时间:2015-03-17 15:34:16

标签: orientdb

简介

您好,

我有一个关于如何创建OrientDB查询的问题。查询应该获取朋友的朋友的所有顶点(这相当于二级关系)+之间的桥梁2.之后,查询应该在边缘属性之后过滤记录。

我正在运行OrientDB 1.7.4。

架构示例:

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

- > User是Vertex,属性为id(int)

- >知道是一个边缘,属性类型(字符串)(让我们说这个属性有几个值:朋友,家人等)

我正在寻找的关系是这样的:

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

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

要获得第二学位的所有用户(User3),这样的查询就足够了:

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

问题:

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

  1. 如果上面的查询返回类User(User3)中的记录列表,如何从用户中间获取用户(User3)和用户(或属性id)的记录关系(见上文:User2)

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

2 个答案:

答案 0 :(得分:1)

正如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)。如果有人对此有所了解,请发表评论。

答案 1 :(得分:0)

你可以这样做:

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

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

如果你想停在第二级,那么

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到第二级的所有可能路径。

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