5

让我们在 OrientDB 图中假设以下模型:

我有一个Profile顶点。配置文件与 2 条边相连:LikedCommented。两条边都有一个“”字段,指示动作的计数(或边的“权重”)。

因此,如果用户 A 对用户 B 的帖子发表了 3 次评论,则从用户 A 到用户 B 的评论边将具有值 = 3。

现在,假设我想获取与用户 B 交互的所有用户(喜欢或评论),按交互的权重排序。我可以使用以下 SQL 来做到这一点:

select * from (traverse out from   
(select out, sum(value) as value from    
(traverse * from (select from Profile where username="B") while $depth < 3)    
where @class="Liked" or @class="Commented" group by out order by value desc)   
while $depth < 2  ) where @class="Profile" )

但是,如果我还想知道交互的权重怎么办?在进行最后一次遍历时如何传播“价值”?

编辑

根据建议,此查询的简化版本将是:

select expand(out) from (    
    select out, sum(value) as value from (    
       select expand(inE("Liked", "Commented")) from Profile 
           where username="B"    
    ) group by out order by value desc 
)

但我仍然找不到使用 LET 将值插入外部扩展对象的方法。$parent 似乎没有指向在最外层选择上展开的对象。

编辑 2

我正在以我能想到的各种方式与 $parent 一起玩。我不明白在这种情况下如何使用它。再次 - 我要解决的问题是如何将 sum(value) 传递给外部结果集。在进行 GROUP BY 时,我没有看到使用 LET 的方法,并且当最外面的选择正在进行扩展时,我也没有看到使用 LET 的方法(因为你不能一起做其他投影扩张)。

此外,使用 $current 的结果似乎不是预期的。例如,以下查询:

select expand($v) from    
   (select from    
      (select expand(inE("Liked", "Commented")) from Profile where @rid=#11:0)   
    let $v  = $current   
   )

返回这个:

{  
   "result" : [{  
       "@type" : "d",
        "@rid" : "#14:4",
        "@version" : 2,
        "@class" : "Commented",
        "value" : 1,
        "out" : "#11:165",
        "in" : "#11:0"
    }, {
        "@type" : "d",
        "@rid" : "#14:4",
        "@version" : 2,
        "@class" : "Commented",
        "value" : 1,
        "out" : "#11:165",
        "in" : "#11:0"
    }, {
        "@type" : "d",
        "@rid" : "#14:4",
        "@version" : 2,
        "@class" : "Commented",
        "value" : 1,
        "out" : "#11:165",
        "in" : "#11:0"
    }
]
}

同一个节点一遍又一遍,而不是所有的边缘,这是我所期望的。

4

2 回答 2

3

我看到您使用的是旧版本的 OrientDB。使用更新的版本,您可以简化它。示例:原始查询:

select * from (
 traverse out from (
  select out, sum(value) as value from (
   traverse * from (
    select from Profile where username="B"
   ) while $depth < 3
  ) where @class="Liked" or @class="Commented" group by out order by value desc
 ) while $depth < 2 
) where @class="Profile" )

您可以通过使用 out()/in()/both() 传递 Edge 的标签/类来跳过一些步骤,例如:

select expand( out(["Liked","Commented]) ) from Profile where username="B"

但是,要传递值,您可以使用带有 LET 子句的变量。例子:

select from XXX let $parent.a = value

通过这种方式,您将变量“a”设置到上层上下文中,但您也可以这样做:

select from XXX let $parent.$parent.a = value

将其设置为 2 个级别。

于 2013-11-11T10:50:37.013 回答
0

我还没有尝试使用 group by,但是您应该能够使用子查询对结果进行分组。这对我有用,其中 prop1、prop2、prop3 等是从边缘出来的顶点的属性(来自 的列select out() Profile where username="B"

select outV().prop1, outV().prop2, outV().prop3, value from (    
   select expand(inE("Liked", "Commented")) from Profile 
       where username="B"    
) order by value desc 
于 2015-04-18T04:46:06.477 回答