这是另一个Neo4j新手问题......
我正在玩一个非常天真和简单的图表。 以下查询应该返回群集,这些群集已定义为群集中的每个朋友都知道群集中的所有其他朋友。在本例中,我将簇大小限制为4,并添加了最后几个AND以使结果唯一(因此我不会得到A,B,C和A,C,B):
MATCH (me { name: 'MyName' }), (f1), (f2), (f3), (f4)
WHERE (me)-[:KNOWS]->(f1)-[:KNOWS]->(me)
AND (f2)-[:KNOWS]->(f1)-[:KNOWS]->(f2)
AND (f2)-[:KNOWS]->(me)-[:KNOWS]->(f2)
AND (f3)-[:KNOWS]->(me)-[:KNOWS]->(f3)
AND (f3)-[:KNOWS]->(f1)-[:KNOWS]->(f3)
AND (f3)-[:KNOWS]->(f2)-[:KNOWS]->(f3)
AND (f4)-[:KNOWS]->(me)-[:KNOWS]->(f4)
AND (f4)-[:KNOWS]->(f1)-[:KNOWS]->(f4)
AND (f4)-[:KNOWS]->(f2)-[:KNOWS]->(f4)
AND (f4)-[:KNOWS]->(f3)-[:KNOWS]->(f4)
AND f1.name < f2.name
AND f2.name < f3.name
AND f3.name < f4.name
RETURN DISTINCT f1.name, f2.name, f3.name, f4.name
现在查询在数据正确性方面效果很好,但我注意到它需要一秒钟才能完成。 这些是Neo4j的正常响应时间吗?有没有更有效的方法来执行相同的查询? 现在,我在我的笔记本电脑上运行Neo4j服务器,但另一方面,我在数据库中只有15个节点....我只能想象当数据库增长时会发生什么......
答案 0 :(得分:2)
您可以尝试将路径定义移至MATCH
。我非常确定您WHERE
中唯一应该使用路径定义的时间就是NOT(path)
。
MATCH (me { name: 'MyName' })-[:KNOWS]->(f1)-[:KNOWS]->(me),
(f2)-[:KNOWS]->(f1)-[:KNOWS]->(f2),
(f2)-[:KNOWS]->(me)-[:KNOWS]->(f2),
(f3)-[:KNOWS]->(me)-[:KNOWS]->(f3),
(f3)-[:KNOWS]->(f1)-[:KNOWS]->(f3),
(f3)-[:KNOWS]->(f2)-[:KNOWS]->(f3),
(f4)-[:KNOWS]->(me)-[:KNOWS]->(f4),
(f4)-[:KNOWS]->(f1)-[:KNOWS]->(f4),
(f4)-[:KNOWS]->(f2)-[:KNOWS]->(f4),
(f4)-[:KNOWS]->(f3)-[:KNOWS]->(f4)
WHERE f1.name < f2.name AND f2.name < f3.name AND f3.name < f4.name
RETURN DISTINCT f1.name, f2.name, f3.name, f4.name
它也使查询更清晰,我认为
答案 1 :(得分:1)
我认为找到群集的另一种方式比这种方法要好得多,例如采用起始点并使用可变长度路径跟踪所有节点到集群末尾,按id对集群节点进行排序,并确保每个节点列表都是唯一的。