首页 > 解决方案 > 所有孩子的 Neo4j 循环

问题描述

在 Neo4j 中,我得到了以下节点: 在此处输入图像描述

如您所见,它们是通过 NEXT 或 NEXT_SIBLING 关系连接的兄弟姐妹;此外,第一个和最后一个孩子通过 FIRST_CHILD_OF 和 LAST_CHILD_OF 连接到父亲。

我只是想找到一种循环它们的方法,以创建一个单一的字符串,即“ABC D”。

是否有一个 Cypher 查询能够做到这一点?

标签: neo4jcypher

解决方案


创建模型

为了方便可能的进一步答案和解决方案,我记下了我的图表创建声明:

CREATE
  (ormText:OrmText {name: 'orm_Text'})<-[:FIRST_CHILD_OF]-(letterA:Letter {name: 'A'}),
  (letterA)-[:NEXT]->(letterB:Letter {name: 'B'}),
  (letterA)-[:NEXT_SIBLING]->(letterB),
  (letterB)-[:NEXT]->(letterC:Letter {name: 'C'}),
  (letterB)-[:NEXT_SIBLING]->(letterC),
  (letterC)-[:NEXT]->(letterD:Letter {name: 'D'}),
  (letterC)-[:NEXT_SIBLING]->(letterD),
  (letterD)-[:LAST_CHILD_OF]->(ormText);

图形

解决方案

MATCH
  letterPath = (startLetter)-[:NEXT|NEXT_SIBLING*]->(endLetter)
WHERE 
  (startLetter)-[:FIRST_CHILD_OF]->(:OrmText)<-[:LAST_CHILD_OF]-(endLetter)
WITH nodes(letterPath) AS letterNodes
UNWIND letterNodes AS letterNode
RETURN DISTINCT letterNode.name AS letterName;

第二行检测 的startLetter第一个子项orm_Text和 的endLetter最后一个子项orm_Text。在第五行计算开始和结束字母之间的路径,在第六行提取其节点。第 7 行创建单节点,第 8 行最终返回结果。

注意:通过编写-[:NEXT|NEX_SIBLING*]->类型NEXT NEXT_SIBLING对匹配有效的关系。如果您的要求只需要一种特定类型,请删除另一种和|.

结果

╒════════════╕
│"letterName"│
╞════════════╡
│"A"         │
├────────────┤
│"B"         │
├────────────┤
│"C"         │
├────────────┤
│"D"         │
└────────────┘

扩大

如果您更喜欢单个String而不是节点名称列表的输出,请查看以下解决方案。

解决方案

MATCH
  letterPath = (startLetter)-[:NEXT|NEXT_SIBLING*]->(endLetter)
WHERE 
  (startLetter)-[:FIRST_CHILD_OF]->(:OrmText)<-[:LAST_CHILD_OF]-(endLetter)
WITH nodes(letterPath) AS letterNodes
RETURN DISTINCT reduce(s=head(letterNodes).name, n in tail(letterNodes) | s+" -> "+n.name) AS letterString;

结果

╒══════════════════╕
│"letterString"    │
╞══════════════════╡
│"A -> B -> C -> D"│
└──────────────────┘

推荐阅读