gpt4 book ai didi

OrientDB SQL - 在保持边权重的同时进行遍历

转载 作者:行者123 更新时间:2023-12-04 05:22:53 24 4
gpt4 key购买 nike

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

我有一个轮廓顶点。
个人资料与 2 条边相连:喜欢和评论。两条边都有一个“值”字段,指示 Action 的计数(或边的“权重”)。

因此,如果用户 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"
}
]
}

一遍又一遍地使用相同的节点,而不是所有的边,这正是我所期望的。

最佳答案

我看到您使用的是旧版本的 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 个级别。

关于OrientDB SQL - 在保持边权重的同时进行遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19895535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com