Wenn die Anzahl der Eigenschaften größer als n ist, kehren Sie aus einem stark verbundenen Diagramm in Neo4j @ zurüc

Diese Frage ist eine direkte Erweiterung einer Frage, die ich zuvor gestellt habeHie (und noch frühere VersionHie).

Say Ich habe eine Graph-Datenbank, die so aussieht:

Genau wie die vorherigen Fragen, die ich gestellt habe, ist das einzig wirklich Interessante daran, dassSomeProperty kann "Ja" oder "Nein" sein.

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

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

(Leichte philosophische Randbemerkung: Ich beginne zu vermuten, dass dies ein schlechtes Diagrammschema ist. Warum? Denn in jedem Knotensatz ist jeder Knoten mit jedem anderen Knoten verbunden. Ich mache mir keine Sorgen über die Tatsache, dass es zwei Gruppen von Knoten gibt, aber die Tatsache, dass beim Auffüllen dieses Diagramms ein Talkback mit der Meldung "530 Zeilen zurückgegeben" angezeigt wird. Ich denke, dies bedeutet, dass tatsächlich 530 Unterpfade innerhalb der Diagrammstruktur erstellt wurden, und dies scheint ein Overkill zu sein.)

mmerhin ist das Problem, das ich zu lösen versuche, fast dasselbe wie das Problem, das ich in dem früheren, einfacheren, lineareren Kontext zu lösen versuchtHie.

Ich möchte den vollständigen Pfad eines dieser disjunkten Diagramme zurückgeben, wohingegen an einer beliebigen Stelle innerhalb des Diagramms die Häufigkeit von @ gezählt wirSomeProperty ist größer als 2.

Ich würde denken, dass dies ein allgemeines, einfaches Problem ist. Angenommen, Sie hatten zwei nicht verwandte Familien, und jemand sagt: "Zeige mir, dass meine Familie mehr als zwei Linkshänder hat."

Das superschicke #cybersam, das für die einfachere Inkarnation dieses Problems empfohlen wird, entspricht etwa den folgenden Kriterien:

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;

... das funktioniert gut, wenn das Diagramm eher einer geraden Linie ähnelt und nicht alle Knoten in der Gruppe miteinander verknüpft sind.

Ich denke, der Grund, warum die # Cybersam-Abfrage dieses komplexere Diagramm nicht handhabt, ist, dass es keinen Terminalknoten gibt.

( Eine weitere philosophische Randnotiz: Ich beginne mit Theorien, die zeigen, dass dichte, komplizierte Beziehungen in einem Graphen sowohl mit der Leistung als auch mit der Abfrage kombinatorische Probleme aufwerfen. Ich denke, das könnte an der Bidirektionalität liegen, die Cypher bei der Abfrage verwendet?)

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

// 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)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage