让我们假设OrientDB图中的以下模型:
我有一个 Profile 顶点。 配置文件与2个边连接:喜欢和评论。两条边都有一个“ 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。在这种情况下,我看不出你如何使用它。再次 - 我试图解决的问题是如何将sum(值)传递给外部结果集。在进行GROUP BY时我没有看到使用LET的方法,当最外面的select选择进行扩展时我也没有看到使用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"
}
]
}
同一个节点一遍又一遍,而不是所有的边缘,这就是我所期望的。
答案 0 :(得分: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级。
答案 1 :(得分:0)
到目前为止,我尚未尝试使用组,但您应该能够使用子查询对结果进行分组。这适用于我,其中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