简介
您好,
我有一个关于如何创建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个主要问题/问题我无法解决:
如果上面的查询返回类User(User3)中的记录列表,如何从用户中间获取用户(User3)和用户(或属性id)的记录关系(见上文:User2)
如何过滤查询以仅通过具有特定属性的边来遍历(或选择)。更具体一点,我希望第二个查询找到来自问题1但是朋友的朋友的用户:User <--knows(method='friend')--> User <--knows(method='friend')--> User
。
答案 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