如您所见,它们是通过NEXT或NEXT_SIBLING关系连接的兄弟姐妹;此外,第一个和最后一个孩子通过FIRST_CHILD_OF和LAST_CHILD_OF连接到父亲。
我只是想找到一种循环它们的方法,以便创建一个单个字符串“ A B C D”。
是否有可以进行此操作的Cypher查询?
答案 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);
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"│
└──────────────────┘