首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OrientDB SQL -在保持边重的同时遍历

OrientDB SQL -在保持边重的同时遍历
EN

Stack Overflow用户
提问于 2013-11-10 21:39:43
回答 2查看 4.7K关注 0票数 5

让我们假设OrientDB图中的模型如下:

我有一个轮廓顶点。配置文件连接两个边:喜欢和评论。两个边都有一个"value“字段,表示操作的计数(或边缘的”权重“)。

因此,如果用户A对用户B的帖子评论了3次,那么用户A到用户B之间就会有一个值=3的注释边缘。

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

代码语言:javascript
复制
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" )

但如果我也想知道互动的重要性呢?如何在进行最后一次遍历时传播“值”?

编辑

根据该建议,该查询的简化版本如下:

代码语言:javascript
复制
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。我看不出你怎么能在这种情况下使用它。同样,我要解决的问题是如何将和(值)传递给外部结果集。我没有看到在进行组时使用LET的方法,也没有看到在外部大多数选择是展开时使用LET的方法(因为您不能在展开的同时进行其他的投影)。

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

代码语言:javascript
复制
select expand($v) from    
   (select from    
      (select expand(inE("Liked", "Commented")) from Profile where @rid=#11:0)   
    let $v  = $current   
   )

返回以下内容:

代码语言:javascript
复制
{  
   "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"
    }
]
}

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

EN

回答 2

Stack Overflow用户

发布于 2013-11-11 10:50:37

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

代码语言:javascript
复制
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()传递边缘的标签/类,您可以跳过一些步骤,如下所示:

代码语言:javascript
复制
select expand( out(["Liked","Commented]) ) from Profile where username="B"

但是,要传递值,可以使用变量和LET子句。示例:

代码语言:javascript
复制
select from XXX let $parent.a = value

通过这种方式,您可以将变量"a“设置为高级上下文,但也可以这样做:

代码语言:javascript
复制
select from XXX let $parent.$parent.a = value

将其设置为2级。

票数 3
EN

Stack Overflow用户

发布于 2015-04-18 04:46:06

到目前为止,我还没有在组中尝试过这种方法,但是您应该能够使用子查询对结果进行分组。这适用于我,其中prop1、prop2、prop3等是从边缘出来的顶点的属性(由select out() Profile where username="B"产生的列)。

代码语言:javascript
复制
select outV().prop1, outV().prop2, outV().prop3, value from (    
   select expand(inE("Liked", "Commented")) from Profile 
       where username="B"    
) order by value desc 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19895535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档