J'ai utilisé cet extrait pour recréer votre ensemble de données:
CREATE
(:Person {name: 'Jan'})-[:Father]->
(:Person {name: 'Mirko'})-[:Father]->
(:Person {name: 'Cupko'})-[:Father]->
(:Person {name: 'Borko'})
Vous devez enregistrer le path et utiliser la longueur du chemin pour obtenir le nombre de sauts:
MATCH p=(b:Person {name: 'Borko'})<-[:Father*]-(n)
RETURN n, length(p)
Ce retour:
╒════════════════╤═══════════╕
│"n" │"length(p)"│
╞════════════════╪═══════════╡
│{"name":"Cupko"}│1 │
├────────────────┼───────────┤
│{"name":"Mirko"}│2 │
├────────────────┼───────────┤
│{"name":"Jan"} │3 │
└────────────────┴───────────┘
Pour la deuxième partie, vous pouvez utiliser la fonction relationships
:
MATCH p=(b:Person {name: 'Borko'})<-[:Father|Mother*]-(n)
WITH p, relationships(p) AS rels, n
RETURN n, length(p) AS hops, type(rels[length(rels)-1]) AS type
Ce retour:
╒════════════════╤══════╤════════╕
│"n" │"hops"│"type" │
╞════════════════╪══════╪════════╡
│{"name":"Cupko"}│1 │"Father"│
├────────────────┼──────┼────────┤
│{"name":"Mirko"}│2 │"Father"│
├────────────────┼──────┼────────┤
│{"name":"Jan"} │3 │"Father"│
└────────────────┴──────┴────────┘
Bien sûr, vous pouvez utiliser des expressions de cas pour convertir le nom de la relation du type approprié, par ex. CASE type(rels[length(rels)-1]) WHEN 'Father' THEN 'Dad' WHEN 'Mother' THEN 'Mom' END AS role