2017-09-27 3 views
2

enter image description hereComment puis-je obtenir le nombre de mêmes relations entre les deux nœuds avec Cypher

Maintenant, je dois requête qui retourne les nœuds ancêtres de Borko avec nombre de sauts relation .. Quelque chose comme ceci:

  • Cupko. .. 1
  • Mirko ... 2
  • Jan ... 3

2ème partie de questio n: Si nous incluons les relations maternelles, à quoi ressemblerait la requête? résultat devrait être quelque chose comme:

  • Cupko ... papa ... 1
  • SomeFemale ... maman ... 1
  • Mirko ... papa ... 2
  • SomeFemale2. .. maman ... 2

Répondre

4

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