gpt4 book ai didi

gremlin - TinkerPop gremlin 仅计算路径中的顶点()

转载 作者:行者123 更新时间:2023-12-04 10:58:54 30 4
gpt4 key购买 nike

当我查询路径时,例如:

g.V(1).inE().outV().inE().outV().inE().outV().path()

path()中既有顶点也有边,请问有没有办法只计算路径中的顶点数而忽略边数?

最佳答案

Gremlin 缺少一些重要的东西来让这件事变得非常容易——它不能很好地识别类型以进行过滤,因此 TINKERPOP-2234 .我对你的例子做了一些改动,这样我们就可以使用一些更棘手的东西:

gremlin> g.V(1).repeat(outE().inV()).emit().path()
==>[v[1],e[9][1-created->3],v[3]]
==>[v[1],e[7][1-knows->2],v[2]]
==>[v[1],e[8][1-knows->4],v[4]]
==>[v[1],e[8][1-knows->4],v[4],e[10][4-created->5],v[5]]
==>[v[1],e[8][1-knows->4],v[4],e[11][4-created->3],v[3]]

使用 repeat() 我们得到可变长度的 Path 实例,因此动态计算顶点比你在问题中的固定示例要复杂一些,其中的模式路径是已知的,仅从 Gremlin 本身就很容易辨别计数。因此,对于动态数量的顶点并且没有 TINKERPOP-2234,您必须发挥创意。一个典型的策略是通过顶点特有的一些标签或属性值过滤掉边缘:

gremlin> g.V(1).repeat(outE().inV()).emit().path().map(unfold().hasLabel('person','software').fold())
==>[v[1],v[3]]
==>[v[1],v[2]]
==>[v[1],v[4]]
==>[v[1],v[4],v[5]]
==>[v[1],v[4],v[3]]
gremlin> g.V(1).repeat(outE().inV()).emit().path().map(unfold().hasLabel('person','software').fold()).count(local)
==>2
==>2
==>2
==>3
==>3

或者也许使用对所有边都是唯一的属性:

gremlin> g.V(1).repeat(outE().inV()).emit().path().map(unfold().not(has('weight')).fold())
==>[v[1],v[3]]
==>[v[1],v[2]]
==>[v[1],v[4]]
==>[v[1],v[4],v[5]]
==>[v[1],v[4],v[3]]
gremlin> g.V(1).repeat(outE().inV()).emit().path().map(unfold().not(has('weight')).fold()).count(local)
==>2
==>2
==>2
==>3
==>3

如果您的架构中没有这些允许这样做的属性或标签,您可能可以使用您的遍历模式来想出一些数学来解决这个问题。就我而言,我知道我的 Path 将始终是 (pathLength + 1)/2 所以:

gremlin> g.V(1).repeat(outE().inV()).emit().path().as('p').math('(p + 1) / 2').by(count(local))
==>2.0
==>2.0
==>2.0
==>3.0
==>3.0

希望其中一种方法能启发您找到解决方案。

关于gremlin - TinkerPop gremlin 仅计算路径中的顶点(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58964047/

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