Neo4j Cypher查询慢找常见的孩子。什么是最好的方法?

时间:2015-01-10 02:46:54

标签: performance neo4j cypher

我是Neo4j的新手 - 2.1.6。在我的图中,任何给定节点都可以有多个父节点和多个子节点,它们也是父节点和其他节点的子节点。我需要做的是找到几个搜索节点都有共同点的父母和孩子。搜索到的节点可以是远离其共同父母或孩子的一到数百个关系。所有节点都有相同的标签。

我正在使用以下cypher查询,但是当你添加多个节点时它非常慢....我想一次搜索20个或更多节点以进行常见连接。在这里,我正在寻找4个节点上的孩子:

MATCH (n1)-[*]->(x), (n2)-[*]->(x), (n3)-[*]->(x), (n4)-[*]->(x)
WHERE n1.name = "node1" AND n2.name ="node2" AND n3.name ="node3" AND n4.name ="node4"
RETURN DISTINCT x.name

还有其他方法我应该接近这个吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

添加标签,并确保您有索引:标签(名称)

e.g。如果您的标签是:Node

create index on :Node(name);

MATCH (n1:Node)-[*]->(x),(n2:Node)-[*]->(x),(n3:Node)-[*]->(x),(n4:Node)-[*]->(x)
USING INDEX n1:Node(name)
USING INDEX n2:Node(name)
USING INDEX n3:Node(name)
USING INDEX n4:Node(name)
WHERE n1.name = "node1" AND n2.name ="node2" AND n3.name ="node3" AND n4.name ="node4"
RETURN DISTINCT x.name

对于很长的路径,Cypher可能会遇到一些问题。

如果您的图表中的频繁操作必须以毫秒结束,我建议为使用Java编写的Neo4j服务器创建服务器扩展。