在Neo4j中使用可变长度模式匹配

时间:2015-11-25 13:48:21

标签: neo4j

过去3个月我一直在使用Neo4j。

我已经构建了一个10M节点图数据库。

我一直在阅读:http://neo4j.com/docs/stable/introduction-pattern.html

我的目标是通过它的属性(简单部分)查找单个节点的值,然后我需要发现连接到具有特定边缘标签的查找节点的所有节点。我的问题是我的行为非常不同,我真的不明白为什么。

底线是我需要一个模式,允许我查找Node1并查找连接到具有特定边缘标签的Node1的每个节点,然后为其分配单个标识符值(这样我就可以说这个组100个节点是ClusterIDGroup1的一部分。

模式1

MATCH (l:CodeType { id_value : '050001' })-[:IDENTIFIED_BY*]-(m:CodeType)
WHERE 1=1
RETURN *
LIMIT 10000
;

返回:62个节点

模式2

MATCH (l:CodeType { id_value : '050001' })-[:IDENTIFIED_BY*30]-(m:CodeType)
WHERE 1=1
RETURN *
LIMIT 10000
;

返回:90个节点

模式3

MATCH (l:CodeType { id_value : '050001' })-[:IDENTIFIED_BY*0..30]-(m:CodeType)
WHERE 1=1
RETURN *
LIMIT 10000
;

返回:115个节点

为什么我会根据变长表达式获得115,90和62?我认为1)*会让我获得最多的节点2)* 0..30会让我获得第二名和3)* 30会让我得到最少的。

由于

1 个答案:

答案 0 :(得分:1)

根据neo4j documentation

  

如果两个节点之间的距离为零,则根据定义它们   同一节点。

所以,回答你的问题:

  • 在第一个查询中,您将获得每个深度内的每个节点,不包括codeType节点(没有0深度)。
  • 在第二个节目中,您只获得与l节点相距30个关系的节点。
  • 在第三个查询中,您获得了更多节点,因为您还获得了您的codeType节点,并且您还可以从l节点获得每个节点的关系深度为0到30。

我认为仅返回l应该会对您有所帮助,return *在我看来绝不是一个好选择。

此外,使用WHERE 1=1在您的查询中无用,您可以安全地删除它。