找到ArangoDB中节点数的交叉节点?

时间:2014-12-17 07:57:19

标签: arangodb

我有许多节点通过其他类型的中间节点连接。像在图片上可以有多个中间节点。我需要找到给定数量节点的所有中间节点,并按照我的初始节点之间的链接数对其进行排序。在给出A,B,C,D的示例中,它应该返回节点E(4个链接)以下节点F(3个链接)。这可能吗?如果不是,可以使用多个请求完成?我正在考虑使用SHORTEST_PATH函数,但似乎它只能找到来自同一集合的节点之间的路径? enter image description here

1 个答案:

答案 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 } ]