首页 > 解决方案 > Neo4j Cypher 获取链表中的所有节点

问题描述

使用下图:

(Boxer)-[:starts]->(Round)-[:continues]->(Round)-[:continues]->(Round)-[:continues]->(Round)

如何让特定拳击手完成所有回合?

现在,我只能通过以下方式从所有拳击手那里获得所有回合:(我错过了第一轮,因为第一个关系是开始而不是继续。

MATCH (boxer:Boxer {id: 5})
MATCH ()-[:continues]->(round:Round)
 RETURN
  boxer {
   .*,
   rounds: collect(distinct round {
    .*
   })
  } as boxer

标签: graphneo4jcypher

解决方案


这可能对您有用:

MATCH p = (boxer:Boxer)-[:starts]->()-[:continues*0..]->(lastRound)
WHERE boxer.id = 5 AND NOT (lastRound)-[:continues]->()
RETURN boxer {
   .*,
   rounds: NODES(p)[1..]
  } as boxer
  • 可变长度关系模式[:continues*0..]用作0下限,以防回合只有一轮。
  • 测试过滤在叶节点处结束的NOT (lastRound)-[:continues]->()路径,以便MATCH仅获取整个回合的路径。
  • 返回的rounds属性应包含回合中的所有回合。
  • 此查询假定startscontinues关系类型始终具有Round结束节点,因此为了提高效率,我们不必费心在MATCH模式中指定这些节点标签。

推荐阅读