我是Neo4j的新手,我刚刚开始研究它。我已经阅读了关于neo4j的基本教程,并且已经掌握了Cypher查询语言。但是我陷入了一个特定的问题。
我的结构为-v
,其中A,B,C,D都是标签。现在我有一个要求,我想要找到与标签D的节点相关的标签A的所有节点,用于D的特定属性。
让我们说
是我的节点f标签D,我想找到所有A连接到D:{name:“Harry”},即name =“harry”标签D。
答案 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