让我们假设OrientDB图中的模型如下:
我有一个轮廓顶点。配置文件连接两个边:喜欢和评论。两个边都有一个"value“字段,表示操作的计数(或边缘的”权重“)。
因此,如果用户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。我看不出你怎么能在这种情况下使用它。同样,我要解决的问题是如何将和(值)传递给外部结果集。我没有看到在进行组时使用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"
}
]
}同一节点一次又一次,而不是所有的边缘,这正是我所期望的。
发布于 2013-11-11 10:50:37
我看你使用的是旧版本的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()传递边缘的标签/类,您可以跳过一些步骤,如下所示:
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级。
发布于 2015-04-18 04:46:06
到目前为止,我还没有在组中尝试过这种方法,但是您应该能够使用子查询对结果进行分组。这适用于我,其中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 https://stackoverflow.com/questions/19895535
复制相似问题