2017-03-21 10 views
0

Helo,Neo4j, Match Knoten mit "OR"

Ich möchte eine grafische Darstellung entsprechen, wo ein Knoten TypeX oder typey war mein erster Gedanke sein:

match (:typeX|typeY)-[]-(z) return z 

Aber dies nicht funktioniert :(

gibt es eine Möglichkeit die Abfrage zweimal ohne Eingabe wie folgt aus:?

match (:typeX)-[]-(z), (:typeY)-[]-(z) return z 

Kann mir jemand helfen? Vielen Dank im Voraus :)

Antwort

2

Einen Weg

MATCH (n) WHERE labels(n) IN ['typeX','typeY'] 
WITH n 
MATCH (n)-[]-(z) 
RETURN z 

jedoch ist, wenn „entweder TypeX oder typey“ häufig abgefragt werden und einigen gemeinsamen Zweck in Ihrer Domain freigeben, können Sie ein weiteres gemeinsames Label ergänzen könnten wie "commonXY" und Abfrage mit diesem Label stattdessen.

0

wird diese Abfrage funktioniert sogar, wenn n mehrere Labels hat:

MATCH (n) 
WHERE ANY(lab IN labels(n) WHERE lab IN ['typeX', 'typeY']) 
MATCH (n)--(z) 
RETURN z 
0

gibt es n:Label

MATCH (n)--(z) 
WHERE n:typeX OR n:typeY 
RETURN z 
0

Leider gibt es keine gute effiziente Art und Weise, dies zu tun, ohne Leistung zu opfern ein n-Prädikat. Alle anderen aktuellen Antworten werden gezwungen, alle Knoten zu scannen und dann auf ihren Etiketten zu filtern, was nicht mit einer großen Anzahl von Knoten funktioniert (PROFILE die Abfragen). Alle effizienten Mittel, die ich kenne, sind ausführlicher.

Sie können eine UNION der beiden Abfragen ausführen, um Knoten einen Sprung von allen zurückzugeben: typeX- und typeY-Knoten.

match (:typeX)--(z) 
return z 
union 
match (:typeY)--(z) 
return z 
Verwandte Themen