2016-04-21 6 views
0

Diese Frage ist eine direkte Erweiterung einer Frage, die ich zuvor here (und sogar frühere Version here).Wenn die Anzahl der Eigenschaften ist größer als n, zurück von einem stark verbundenen Grafik in Neo4j

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

enter image description here

Genau wie die vorherigen Fragen, die ich gefragt, die einzige wirklich interessante daran ist, dass SomeProperty kann ‚Ja‘ oder ‚sein Nein ".

In der obersten Zeile hat 1 der drei Knoten ein 'Ja' für diese Eigenschaft.

In der unteren Zeile haben 3 Knoten der fünf Knoten ein 'Ja' für diese Eigenschaft.

() Leichte philosophische Randbemerkung: Ich fange an zu vermuten, dass dies ein schlechtes Diagrammschema ist. Warum? Weil jeder Knoten in jedem Knoten mit jedem anderen Knoten verbunden ist. Ich mache mir keine Sorgen über die Tatsache, dass es zwei Gruppen von Knoten gibt, aber die Tatsache, dass wenn ich dieses Diagramm bevölke, ich Talkback bekomme, das sagt, "530 Zeilen zurückgegeben." Ich denke, das bedeutet tatsächlich 530 Unterpfade innerhalb der Graphstruktur erstellt und das scheint wie Overkill .)

Wie auch immer, das Problem, das ich versuche zu lösen, ist ziemlich genau das selbe wie das Problem, das ich in dem früheren, einfacheren, lineareren Kontext zu lösen versuchte here.

Ich möchte den vollständigen Pfad einer dieser beiden disjunkten Graphen zurückzukehren, während überall in dem Diagramm die Zählung die Vorkommen von SomeProperty größer als 2

Ich würde denken, dies ein gemeinsames, einfaches Problem ist. Nehmen wir zum Beispiel an, du hattest zwei Familien, die nichts miteinander zu tun haben, und jemand sagt: "Zeig es mir mit der Familie, es gibt mehr als zwei Linkshänder."

Der Super Smart #cybersam für die einfachere Inkarnation dieses Problem zu empfehlen, etwas entlang der Linien von:

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; 

... die großen Werke, wenn der Graph mehr einer geraden Linie ähnelt, und doesn‘ t Jeder Knoten in der Menge ist mit jedem anderen Knoten verbunden.

Ich denke, der Grund, warum die # cybersam-Abfrage nicht mit diesem komplexeren Graphen umgehen kann, ist, dass es keinen Endknoten gibt.

(Ein weiterer philosophische Bemerkung am Rande. Ich fange mit Theorien zu entwickeln, die dichten, komplizierte Beziehungen in einem Diagramm darstellen kombinatorische Probleme, mit Leistung sowie der Abfrage Ich denke, das auf die Bidirektionalität zurückzuführen sein könnte verwendet von Cypher bei der Abfrage?)

Hier sind meine Daten. Jeder Rat ist dankbar und danke, dass Sie mir geholfen haben, die Lernkurve zu klettern.

// match (n) detach delete n; 

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)-[:RELATED_TO]->(annie) 
CREATE (annie)-[:RELATED_TO]->(albert) 
CREATE (annie)-[:RELATED_TO]->(adrian) 
CREATE (adrian)-[:RELATED_TO]->(annie) 
CREATE (albert)-[:RELATED_TO]->(adrian) 
CREATE (adrian)-[:RELATED_TO]->(albert) 


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)-[:RELATED_TO]->(barb) 
CREATE (barb)-[:RELATED_TO]->(bill) 
CREATE (barb)-[:RELATED_TO]->(barry) 
CREATE (barry)-[:RELATED_TO]->(barb) 
CREATE (barry)-[:RELATED_TO]->(bart) 
CREATE (bart)-[:RELATED_TO]->(barry) 
CREATE (bart)-[:RELATED_TO]->(bartholemu) 
CREATE (bartholemu)-[:RELATED_TO]->(bart) 
CREATE (bill)-[:RELATED_TO]->(bartholemu) 
CREATE (bartholemu)-[:RELATED_TO]->(bill) 
+0

Anstatt zu versuchen, und ringen mit einer anderen Variation Ihrer Frage, können Sie uns sagen, was das Problem, das Sie ist Versuchen Sie zu lösen statt der Lösung, von der Sie denken, dass Sie sie brauchen? –

+0

Es gibt keinen Endknoten ... was Sie in Ihrer vorherigen Frage verlangt haben. Wenn Sie die WHERE/NOT-Bedingungen loswerden, verschwindet die Endknoten-Filterung. –

Antwort

1

Wenn dies über Familien von Menschen ist, dann einfachste Lösung ist es, einen hinzuzufügen: Familie Knoten für jede relationale Gruppe, etwa so:

create (f:Family) with f 
match (a:person {name:"Adrian"})-[:RELATED_TO*]->(b:person) 
merge (f:Family)<-[:FAMILY]-(a) 
merge (f:Family)<-[:FAMILY]-(b) 

Ersetzen „Adrian“ mit „Barry“ zu schaffen, die zweite Familiengruppe.

Das gibt Ihnen einen zentralen: Familienknoten für jede Familiengruppe. Anschließend können Sie die Familiengruppe auswählen, die genug hat: person.SomeProperty = „Yes“ Familienmitglieder wie folgt:

// Find families with 2 or more :person.SomeProperty = "yes" 
match p = (f:Family)<-[:FAMILY]-(psn:person) 
where psn.SomeProperty = "Yes" 
with f, count(psn) as cnt 
where cnt > 2 

// Get the family members 
match (a:person)<-[r1:RELATED_TO]-(b:person)-[r2:RELATED_TO*]->(c) 
where (a)-[:FAMILY]-(f) 
    and a = c // to get all the nodes in the loop 

// report the first record which'll have two 
// family members and all the relationships 
return a, r1, b, r2 
limit 1 
+0

Vielen Dank dafür! Es funktioniert fast perfekt. Es ist eine kreative Idee, an die ich nicht einmal gedacht habe - jeder Familie einen neuen Knoten hinzuzufügen, um zu zeigen, dass sie isoliert sind. Das einzige Problem ist, dass einer der neuen Knoten nicht erstellt wird und die Abfrage für immer ausgeführt wird ... http: //stackoverflow.com/questions/36781902/query-performance-when-adding-a-new-node-in -neo4j –

+0

Willkommen! Wenn das funktioniert, bitte markieren Sie es als Antwort und geben Sie eine positive Bewertung. :) –

Verwandte Themen