【问题标题】:OrientDB query friend of friends with more information and filteringOrientDB 查询好友好友信息及过滤
【发布时间】:2015-03-17 15:34:16
【问题描述】:

简介:

嗨,

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

我正在运行 OrientDB 1.7.4。

架构示例:

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

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

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

我要找的关系是这样的:

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

我需要所有关系,不管它们有什么方向(即使方向对其他查询很重要)。

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

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

问题:

现在,我有 2 个主要问题/我无法弄清楚:

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

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

【问题讨论】:

  • 这个select bothE('knows')[method='friend'] from User 为您提供了方法“朋友”的优势。也许它可以帮助你。
  • 您好,请为您解答。这会有所帮助,但这并不是我想要的。这样我可以得到边缘,但不能得到顶点。我需要我的输出属于 User 类。

标签: orientdb


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

【讨论】:

  • 我相信 out 这里:inE('knows')[method='friend'].out 是一个属性,而不是一个函数。这就是为什么 .both 不起作用的原因。
  • 您可以按照我上面的回答中的说明使用 bothV()
【解决方案2】:

你可以这样做:

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 到第 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

【讨论】:

    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2012-07-30
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多