2016-06-01 14 views
1

Für query:Cypher - WO ANY Kreuzung

MATCH (movie:Movie {name:'The Matrix'})-[:has_tag]->(movie1Tag:Tag) 
WITH movie, collect(movie1Tag) AS movie1Tags 
MATCH (movie2:Movie)-[:has_tag]->(movie2Tag:Tag) 
WITH movie, movie1Tags, collect(movie2Tag) AS movie2Tags, movie2 
WHERE ANY(movieTag IN movie1Tags 
        WHERE movieTag IN movie2Tags) 
     AND NOT movie.name = movie2.name 
RETURN DISTINCT movie2.name 

Gibt es eine Möglichkeit, die Kreuzungen von der WHERE ANY Anweisung zurück? Gibt es eine Möglichkeit, die Abfrage zu ändern, um sie zurückzugeben?

Bearbeiten: Ich habe es dank Anomaly211 Antwort funktioniert. Ich bewarb mich auch die Kreuzungen auf die Beziehung mit EXTRACT, die ich im Folgenden bei Menschen aufgenommen haben Interesse

MATCH (movie:Movie {name:'The Matrix'})-[:has_tag]->(movie1Tag:Tag) 
WITH movie, collect(movie1Tag) AS movie1Tags 
MATCH (movie2:Movie)-[:has_tag]->(movie2Tag:Tag) 
WITH movie, movie1Tags, collect(movie2Tag) AS movie2Tags, movie2 
WITH movie, movie1Tags, collect(movie2Tag) AS movie2Tags, movie2 FILTER(x IN movie1Tags WHERE x IN movie2Tags) AS intersect 
    FILTER(x IN movie1Tags WHERE x IN movie2Tags) AS intersect 
WHERE ANY(movieTag IN movie1Tags WHERE movieTag IN movie2Tags) AND NOT movie.name = movie2.name AS intersect 
CREATE UNIQUE (movie)-[:share_tags {shared:EXTRACT(x IN intersect | x.identifier)}]->(movie2) 
RETURN DISTINCT movie2.name, intersect 
+0

Was meinen Sie durch den Schnitt? Wie wäre es mit einem Beispiel? –

+0

Film 1 hat Tags "Action", "90er", "Fantasy" und "Science-Fiction". Movie 2 hat Tags "Science Fiction", "90er" und "Comedy". Die Schnittmenge sind die Tags "Science-Fiction" und "90er" - die Tags, die beide teilen – Airomega

Antwort

1

Sie können die Ergebnisse filtern und überprüfen Sie die Kreuzung.

FILTER(x IN movie1Tags.name WHERE x IN movie2Tags.name) 

Dies sollte Sie geben nur die Tags, die in den beiden movie1tags vorhanden sind und movie2tags

+1

Excellent. Ich bin froh, dass du es geschafft hast. – Anomaly211

+1

@Airomega - Sie können Ihre Lösung zu Ihrer ursprünglichen Frage hinzufügen. –

+0

Gute Idee. Erledigt: D – Airomega