2016-05-04 3 views
0

Sagen wir, ich habe ein Datenbankmodell wie in Bild (1) dargestellt, wo jede Person eine Alter-Eigenschaft hat und ich alle Kinder zweiter Ordnung, die der Sohn einer Tochter (Alter> 50) beginnend bei einem gegebenen Knoten. Für das gegebene Datenbankschema wäre mein erwartetes Ergebnis bei Bob [Tim, Sam].Match rekursive Muster bestehend aus mehreren Beziehungen in Chiffre

enter image description here

Ich habe bereits versucht, den ‚*‘ Operator für Beziehungen variabler Länge Abfrage konnte es aber nicht so weit an der Arbeit. Ich habe versucht,

START bob=node(0) MATCH (bob)-[:daughter*]->(p:Person)-[:son*]->(s) 
WHERE p.age > 50 RETURN bob, sbob, s 

die nur Bob und Tim zurückkehrt, sowie

MATCH (:Person)-[:daughter*]->(p:Person)-[:son*]->(s) 
WHERE p.age > 50 RETURN collect(s) 

, die mir gibt [Tim, Bob, Tom, Sam].

Gibt es eine Möglichkeit, mein erwartetes Ergebnis ohne Änderung der Datenbankstruktur zu erhalten?

aktualisieren Als zusätzliche Anforderung alle daugthers entlang eines Pfades als 50 Jahre alt sein müssen, das heißt, wenn Tina 48 ist und Carmen ist 52 (während praktisch unmöglich) eine leere Sammlung (das Alter der Kinder zurückgeführt wird don‘ t Sache).

Antwort

0
// 
// Find daughters with age > 50 
MATCH (bob:Person {name:'Bob'}), path = (bob)-[:son|daughter*]->(d:Person) 
    WHERE type(last(relationships(path))) = 'daughter' and d.age>50 
// 
// Check if all daughters at path over age 50 
WITH d, nodes(path) as nodes, relationships(path) as rels, 
    range(0, length(path)-1) as index 
    WHERE none(i in index 
       WHERE type(rels[i]) = 'daughter' AND 
         nodes[i+1]['age'] <= 50 
     )  
// 
// Find sons of daughter 
MATCH (d)-[:son]->(s:Person) 
RETURN collect(s) 
+0

Das löst meine Frage, wenn man annimmt, dass Kinder jünger sind als ihre Eltern. Obwohl praktisch unmöglich, möchte ich diese Annahme in meiner Frage auslassen. Bitte sehen Sie meine aktualisierte Frage. – tNewhomes

+0

N/P - siehe update :) –

+0

Ausführen Ihrer Abfrage Ich bekomme eine Typkonflikt beim Zugriff auf die Alter-Eigenschaft mit neo4j 2.2.3. Ich konnte dies umgehen, indem ich 'extract' verwendete, um eine Sammlung mit den Alter aller Knoten im Pfad zu erhalten. Vielen Dank für Ihre Hilfe – tNewhomes

Verwandte Themen