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

ser*_*eda 4 arangodb

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

mch*_*cki 6

非常好的问题,它挑战了我脑中的AQL部分;)好消息:完全有可能只有一个查询利用GRAPH_COMMON_NEIGHBORS和一部分数学.常见的邻居将计算您选择的顶点中有多少是十字架是连接组件(考虑到订购AEB与BEA的不同),使用组合,我们最终有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 } ]