我有许多节点通过其他类型的中间节点连接。像在图片上可以有多个中间节点。我需要找到给定数量节点的所有中间节点,并按照我的初始节点之间的链接数对其进行排序。在给出A,B,C,D的示例中,它应该返回节点E(4个链接)以下节点F(3个链接)。这可能吗?如果不是,可以使用多个请求完成?我正在考虑使用SHORTEST_PATH函数,但似乎它只能找到来自同一集合的节点之间的路径?
答案 0 :(得分:6)
非常好的问题,它挑战了我脑中的AQL部分;)
好消息:只有一个查询利用GRAPH_COMMON_NEIGHBORS
和一部分数学完全有可能。
常见的邻居将计算你选择的十字架中有多少是十字架是连接组件(考虑到排序A-E-B与B-E-A的不同),使用组合学,我们最终得到a*(a-1)=c
多个组合,其中c是比较的。我们使用p / q公式来识别a(在集合中给出的连接顶点的数量)。
如果顶点的type
在顶点对象的属性中编码
生成的AQL如下所示:
FOR x in (
(
let nodes = ["nodes/A","nodes/B","nodes/C","nodes/D"]
for n in GRAPH_COMMON_NEIGHBORS("myGraph",nodes , nodes)
for f in VALUES(n)
for s in VALUES(f)
for candidate in s
filter candidate.type == "cross"
collect crosses = candidate._key into counter
return {crosses: crosses, connections: 0.5 + SQRT(0.25 + LENGTH(counter))}
)
)
sort x.connections DESC
return x
如果将十字架放在不同的集合中并按集合名称进行过滤,查询甚至会变得更有效率,我们不需要打开任何非交叉类型的顶点。
FOR x in (
(
let nodes = ["nodes/A","nodes/B","nodes/C","nodes/D"]
for n in GRAPH_COMMON_NEIGHBORS("myGraph",nodes, nodes,
{"vertexCollectionRestriction": "crosses"}, {"vertexCollectionRestriction": "crosses"})
for f in VALUES(n)
for s in VALUES(f)
for candidate in s
collect crosses = candidate._key into counter
return {crosses: crosses, connections: 0.5 + SQRT(0.25 + LENGTH(counter))}
)
)
sort x.connections DESC
return x
两个查询都会在您的数据集上产生结果:
[
{
"crosses": "E",
"connections": 4
},
{
"crosses": "F",
"connections": 3
}
]