让我们在 OrientDB 图中假设以下模型:
我有一个Profile顶点。配置文件与 2 条边相连:Liked和Commented。两条边都有一个“值”字段,指示动作的计数(或边的“权重”)。
因此,如果用户 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"
}
]
}
同一个节点一遍又一遍,而不是所有的边缘,这是我所期望的。