Ich benutze Neo4J und lernen Cypher, und habe eine Frage zum Filtern von Ergebnissen basierend auf einem Attribut des ersten angetroffenen Knotens eines bestimmten Typs (in der OPTIONAL MATCH
Zeile des Beispielcodes unten).Kann Cypher Ergebnisse basierend auf einem Attribut des ersten gefundenen Knotens eines bestimmten Typs filtern?
Meine Frage lautet wie folgt:
MATCH
(a:Word),
(b:Word)
WHERE a.lemma IN [ "enjoy" ]
AND b.lemma IN [ "control", "achievement" ]
OPTIONAL MATCH p = shortestPath((a)-[:IS_DEFINED_AS|IS_A_FORM_OF*..15]-(b))
RETURN
a.lemma as From, b.lemma as To,
length(
filter(n in nodes(p) WHERE 'Word' in labels(n))
) - 1 as Shortest_Number_of_Hops_Only_Counting_Words,
length(p) as Shortest_Number_of_Hops_Counting_All_Nodes
Zwei allgemeine Typen von Pfaden können in der Datenbank auftreten:
(a:Word) <-[IS_A_FORM_OF]- (Morph) -[IS_A_FORM_OF]-> (Word) -[IS_DEFINED_AS]-> (Synset) <-[IS_DEFINED_AS]- (Word) -[IS_DEFINED_AS]-> (Synset) <-[IS_DEFINED_AS]- (b:Word)
und
(a:Word) -[IS_DEFINED_AS]-> (Synset) <-[IS_DEFINED_AS]- (Word) -[IS_DEFINED_AS]-> (Synset) <-[IS_DEFINED_AS]- (b:Word)
Es kann eine beliebige Anzahl von Sprüngen sein (derzeit in der obigen Abfrage auf 15 begrenzt) zwischen a
und b
.
Ich habe versucht, ein sehr spezifisches Beispiel oben zu geben, aber meine Frage ist wirklich eine sehr allgemeine über die Verwendung von Cypher: Ich möchte nach Pfaden filtern, in denen der erste gefundene Synset Knoten ein bestimmtes Attribut enthält (z Beispiel {part_of_speech: 'verb'}
Ich habe die Cypher refcard gelesen und frage mich, ob der Ausdruck head()
verwendet werden sollte, um irgendwie den ersten Synset-Knoten im Pfad auszuwählen, aber ich bin mir nicht sicher, wie das geht dies dem MATCH/WHERE-Anweisung?
Vielen Dank für Ihren Vorschlag! Das hat mir viel bei der Konstruktion der Antwort geholfen, die ich unten gefunden habe. Ich habe erst erkannt, dass es möglich ist, mit Cypher Pfade hinzuzufügen. Ich bin dankbar für deine Hilfe:) –