我的问题如下。我在 Neo4j 中有一个小而密集的网络(~280 个节点,~3600 个关系)。只有一种类型的节点和一种类型的边(即,每个类型都有一个标签)。现在,我想指定两个不同的节点组,由它们的“组”属性的值给出,并匹配由连接两个组的特定长度的所有路径组成的子图。此外,我想添加对关系的约束。所以,目前我有这个:
MATCH (n1) WHERE n1.group={group1}
MATCH (n2) WHERE n2.group={group2}
MATCH p=(n1)-[r*1..3]-(n2)
WHERE ALL(c IN r WHERE c.weight > {w})
AND ALL(n in NODES(p) WHERE 1=length(filter(m in NODES(p) WHERE m=n)))
WITH DISTINCT r AS dr, NODES(p) AS ns
UNWIND dr AS udr UNWIND ns AS uns
RETURN COLLECT(DISTINCT udr), COLLECT(DISTINCT uns)
这实现了我想要的,但在某些情况下似乎太慢了。在这里,WHERE 语句过滤掉权重属性低于阈值的关系以及包含循环的路径。
最后三行与所需的输出格式有关。给定匹配的子图(路径),我想要一个列表中的所有唯一关系,以及另一个列表中的所有唯一节点(用于使用 d3.js 进行可视化)。我发现这样做的唯一方法是展开所有元素,然后将它们作为 DISTINCT 收集。
另请注意,组属性和重量限制作为查询参数传入。
现在,有什么方法可以更快地达到相同的结果?例如,对于长度为 3 的路径,在我的本地计算机上查询大约需要 5-10 秒(取决于所选节点组的连接性),并按约 50 个节点和数百个关系的顺序返回。这似乎在可接受的性能范围内。然而,长度为 4 的路径已经令人望而却步(几分钟或永远不会返回)。
额外的问题:有没有办法将路径长度的上限指定为参数?或者不同的限制是否意味着完全不同的查询计划?