Neo4j Cypher получает все узлы в связанном списке - PullRequest
1 голос
/ 04 февраля 2020

Со следующим графиком:

(Боксер) - [: начинается] -> (Вокруг) - [: продолжается] -> (Вокруг) - [: продолжается] -> (Вокруг) - [: продолжение] -> (Раунд)

Как я могу получить все раунды, сделанные определенным c боксером?

Сейчас я могу получить ВСЕ раунды только из ВСЕХ боксеры с этим: (И я пропускаю первые раунды, потому что первые отношения начинаются, а не продолжаются.

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

1 Ответ

2 голосов
/ 04 февраля 2020

Это может работать для вас:

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 свойство должно содержать все раунды в схватке.
  • В этом запросе предполагается, что типы отношений starts и continues всегда имеют конечные узлы Round, поэтому для эффективности мы не пытаемся указывать эти узлы этикетки в шаблоне MATCH.
...