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 个我无法解决的主要问题:
如果上面的查询 return 来自 class 用户 (User3) 的记录列表,我怎样才能获得用户 (User3) 和用户 (或 属性 id)来自关系中间的用户(见上文:User2)
如何过滤查询以仅通过具有特定 属性 的边遍历(或 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
简介:
嗨,
我有一个关于如何创建 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 个我无法解决的主要问题:
如果上面的查询 return 来自 class 用户 (User3) 的记录列表,我怎样才能获得用户 (User3) 和用户 (或 属性 id)来自关系中间的用户(见上文:User2)
如何过滤查询以仅通过具有特定 属性 的边遍历(或 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