2016-04-19 10 views
0

Diese Frage ist eine direkte Erweiterung von a question Ich fragte bereits.Wenn die Anzahl der Eigenschaften größer als n ist, geben Sie einen Untergraphen in Neo4j zurück

sagen, dass ich eine Graph-Datenbank haben, die wie folgt aussieht:

enter image description here

Genau wie die vorherige Frage, die ich fragte, die einzige wirklich interessante daran ist, dass SomeProperty sein kann ‚Ja‘ oder ‚Nein ".

In der oberen Reihe hat 1 der 3 Knoten ein 'Ja' für diese Eigenschaft.

In der unteren Zeile gibt es 3 Knoten, die für diese Eigenschaft ein 'Ja' haben. Die anderen 2 haben ein "Nein".

Wie schreibe ich eine Cypher-Abfrage, die nur THE WHOLE die untere Zeile zurückgibt, indem Sie die Frage stellen: Hat einer dieser disjunkten Untergraphen 2 oder mehr Werte für SomeProperty = 'Ja'?

Früher empfahl die brillante @cybersam etwas mit wie:

MATCH p=(:Person)-[:RELATED_TO*]->(:Person) 
WHERE 2 < REDUCE(s = 0, x IN NODES(p) | CASE WHEN x. SomeProperty = 'Yes' THEN s + 1 ELSE s END) 
RETURN p; 

..., die die passenden Wege zurückkehren würde. In diesem Fall würde das Rück dieser

enter image description here

aber ich versuche, dies zu verallgemeinern das ganze Set von 5 „B“ Knoten zurückzukehren.

Nachdem ich damit zu kämpfen habe, merke ich, dass ich versuche, den 3-Knoten-Subgraphen zu erstellen, aber nicht zurückgeben. Ich versuche, seine Existenz als eine Möglichkeit zu verwenden, den Supergraph meines Matches zurückzugeben und alle nicht verbundenen Subgraphen zu ignorieren! Das wird ziemlich kompliziert und ich bin ratlos.

Hier ist mein Code:

CREATE (albert:person {gender: 'Male', name: 'Albert', SomeProperty: 'Yes'}) 
CREATE (annie:person {gender: 'Female', name: 'Annie', SomeProperty: 'No'}) 
CREATE (adrian:person {gender: 'Female', name: 'Adrian', SomeProperty: 'No'}) 

CREATE (albert)-[r1:RELATED_TO]->(annie) 
SET r1.relationship='related' 
CREATE (annie)-[r2:RELATED_TO]->(adrian) 
SET r2.relationship='related' 

CREATE (bill:person {gender: 'Male', name: 'Bill', SomeProperty: 'Yes'}) 
CREATE (barb:person {gender: 'Female', name: 'Barb', SomeProperty: 'Yes'}) 
CREATE (barry:person {gender: 'Male', name: 'Barry', SomeProperty: 'Yes'}) 
CREATE (bart:person {gender: 'Male', name: 'Bart', SomeProperty: 'No'}) 
CREATE (bartholemu:person {gender: 'Male', name: 'Bartholemu', SomeProperty: 'No'}) 

CREATE (bill)-[r4:RELATED_TO]->(barb) 
SET r4.relationship='related' 
CREATE (barb)-[r5:RELATED_TO]->(barry) 
SET r5.relationship='related' 
CREATE (barry)-[r6:RELATED_TO]->(bart) 
SET r6.relationship='related' 
CREATE (bart)-[r7:RELATED_TO]->(bartholemu) 
SET r7.relationship='related' 

Antwort

1

Diese Abfrage wird alle Teilpfade aus den Ergebnissen herausfiltern:

MATCH p=(a:person)-[:RELATED_TO*]->(b:person) 
WHERE 
    NOT()-[:RELATED_TO]->(a) AND 
    NOT (b)-[:RELATED_TO]->() AND 
    2 < REDUCE(s = 0, x IN NODES(p) | CASE WHEN x. SomeProperty = 'Yes' THEN s + 1 ELSE s END) 
RETURN p; 

Erläuterung:

  • NOT()-[:RELATED_TO]->(a) wahr ist, wenn die a Knoten ist nicht das Ende einer RELATED_TO Beziehung.
  • NOT (b)-[:RELATED_TO]->() ist wahr, wenn der b-Knoten nicht am Anfang einer RELATED_TO-Beziehung steht.

Daher kann ein übereinstimmender Pfad kein Unterpfad sein.

+0

Was macht das '*' Zeichen in '[: RELATED_TO *]'? –

+0

Das '*' in einer Beziehung zeigt eine [variable Länge] (http://neo4j.com/docs/stable/introduction-pattern.html#_variable_length) Beziehung an. – cybersam

+0

ah ... ich verstehe. Es bedeutet "Übereinstimmung mit beliebigen Pfaden beliebiger Länge in Bezug auf die Beziehung RELATED_TO". Vielen Dank! –

Verwandte Themen