2017-12-28 8 views
-2

Ich bin neu in Cypher/Graph DBs. Ich habe ein Beispiel erstellt, um Traversalen zu verstehen, aber nicht ganz.Cypher: Gruppierung/Beziehungen

//Cypher below to create nodes. 
(`0` :Person {id:'74474',Name:"Mr. Dan"}) , 
    (`1` :Company {id:'1234',Name:"Company A"}) , 
    (`2` :Company {id:'1111',Name:"Company B"}) , 
    (`3` :Person {id:'0844',Name:"Mr.X"}) , 
    (`4` :Person {id:'3455',Name:"Mr. Jack"}) , 
    (`5` :Person {id:'748222',Name:"Mr.Y"}) , 
    (`0`)-[:`owns` {amt:'50%'}]->(`1`), 
    (`4`)-[:`owns` {amt:'30%'}]->(`1`), 
    (`2`)-[:`owns` {amt:'20%'}]->(`1`), 
    (`3`)-[:`owns` {amt:'30%'}]->(`2`), 
    (`5`)-[:`owns` {amt:'70%'}]->(`2`) 
// end 

Abfrage: MATCH (p: Person) - [o: besitzt *] -> (c: Gesellschaft) wo c.Name = "Firma A" return p, o //

Dies gibt mir alle "Personen", die "Firma A" besitzen, aber ich möchte das "% Eigentum" jeder Person erhalten.

Ich kann nicht scheinen, die Werte in der Beziehung "o" zu extrahieren oder zu aggregieren. Sah einfach, aber ich scheine herausgefordert!

Irgendwelche Vorschläge?

+2

Bitte formatieren Sie Ihren Code so, dass er für uns lesbar ist! – Skam

+0

MATCH (p: Person) - [o: besitzt *] -> (c: Firma) wo c.Name = "Firma A" Rückkehr p, o.amt, c – logisima

+0

@ logisima- nicht funktioniert, nicht sicher, die Absicht von Hinzufügen von c. Ich versuche, die "Amts" für jede Person zusammenzufassen. Wenn also bei Person zwei "Amts" in dem Beziehungspfad vorhanden sind, dann sollte es aggregieren (in diesem Fall multiplizieren). Aber selbst wenn ich sie zusammenfassen kann, ist das ein Anfang. –

Antwort

0

Zum einen wird es einfacher sein, Ihre Eigentumsrechte zu multiplizieren, wenn Sie numerische Werte anstelle eines Zeichenfolgenwerts verwenden. Sie müssen im Dezimalformat .5 statt '50%' sein.

Vielleicht so etwas wie diese versuchen (nach Ihrer amt Werte ändern schwimmt), REDUCE() verwenden alle Beträge über die Beziehungen auf dem Weg zu multiplizieren:

MATCH (p:Person)-[owns:owns*]->(c:Company) 
WHERE c.Name="Company A" 
RETURN p, reduce(amt = 1, o in owns | amt * o.amt) as percentOwned 

Eine Sache im Auge, dass ein zu halten Variable in einer Beziehung mit variabler Länge (wobei wir * verwenden) verweisen auf eine Sammlung von Beziehungen, nicht auf eine einzelne Beziehung.

+0

danke @InverseFalson, komischerweise. Ich habe die gleiche Lösung durch Versuch und Irrtum erreicht. Realisiert die% sind nicht gut behandelt und auch reduzieren ist die einzige Funktion, die funktioniert. –