Neo4j循环适用于所有儿童

时间:2018-11-12 11:56:24

标签: neo4j cypher

在Neo4j中,我得到了以下节点: enter image description here

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

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

是否有可以进行此操作的Cypher查询?

1 个答案:

答案 0 :(得分:2)

创建模型

为便于进一步解答和解决方案,我注意到了我的图形创建语句:

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);

graph

解决方案

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的最后一个孩子。 在第五行中,计算了起始字母和结束字母之间的路径,并在第六行中提取了其节点。第七行创建单打节点,第八行最后返回结果。

注意:通过写入-[: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"│
└──────────────────┘