如何根据Neo4j中节点(条件节点)的特定属性获取与节点(条件)关联的节点(所需节点)

时间:2015-12-29 07:43:14

标签: neo4j cypher

我是Neo4j的新手,我刚刚开始研究它。我已经阅读了关于neo4j的基本教程,并且已经掌握了Cypher查询语言。但是我陷入了一个特定的问题。

我的结构为-v,其中A,B,C,D都是标签。现在我有一个要求,我想要找到与标签D的节点相关的标签A的所有节点,用于D的特定属性。 让我们说

  1. D:{name:“Tom”}
  2. D:{name:“Dick”}
  3. D:{name:“Harry”}
  4. 是我的节点f标签D,我想找到所有A连接到D:{name:“Harry”},即name =“harry”标签D。

1 个答案:

答案 0 :(得分:2)

这应该非常简单。如果你只想要与“哈利”相关的那些:

MATCH (a:A)-[:relX]->(:B)-[:relY]->(:C)-[:relZ]->(:D {name: 'Harry'})
RETURN a

如果您想匹配多个名称并返回所有a s:

MATCH (a:A)-[:relX]->(:B)-[:relY]->(:C)-[:relZ]->(d:D)
WHERE d.name IN ['Tom', 'Dick', 'Harry']
RETURN a

您可能还想知道每个D匹配的a名称:

MATCH (a:A)-[:relX]->(:B)-[:relY]->(:C)-[:relZ]->(d:D)
WHERE d.name IN ['Tom', 'Dick', 'Harry']
RETURN d.name, a

为了更有效地返回信息,您可以为每个名称找到a个节点集合为数组:

MATCH (a:A)-[:relX]->(:B)-[:relY]->(:C)-[:relZ]->(d:D)
WHERE d.name IN ['Tom', 'Dick', 'Harry']
RETURN d.name, collect(a)

最后,作为样式提示,我通常会尝试在开始时放置“锚点”节点(其中一个有条件的节点)。那看起来像是:

MATCH (d:D)<-[:relZ]-(:C)<-[:relY]-(:B)<-[:relX]-(a:A)
WHERE d.name IN ['Tom', 'Dick', 'Harry']
RETURN d.name, collect(a)

有关更多Cypher风格的提示,请参阅Nigel Small的The Zen of Cypher