2016-11-18 4 views
0

Nicht sicher, ob der Titel alles erklärt, aber ich Cypher lernen mit Neo4j und der Movie Database (von hier: https://neo4j.com/developer/example-data/) und ich versuche eine Abfrage zu erstellen, die mir jeden Film, dessen Regisseur gibt hat auch darin gehandelt.Findet Knoten mit 2 Beziehungen

Um ein Beispiel für einen solchen Film zu geben, spielte Pulp Fiction - Quentin Tarantino sowohl in und leitete den Film.

Ich kam mit dieser Abfrage für das obige Beispiel oben:

match (m:Movie)-[:ACTS_IN]-(d:Director)-[:DIRECTED]->(n:Movie) 
where d.name STARTS WITH 'Q' 
return * 

Aber es scheint nicht so, wie ich es erwartet zu arbeiten. Ich bekomme alle Filme, in denen er Regie geführt und gespielt hat, während ich nur diejenigen möchte, bei denen er beides gemacht hat.

Antwort

1

Sie hatten bereits d und m deklariert, so dass Sie in der zweiten MATCH-Anweisung keine Beschriftungen mehr zuweisen. Die richtige Abfrage würde so aussehen

MATCH (d:Director)-[:DIRECTED]->(m:Movie) 
WHERE d.name STARTS WITH 'Q'  
MATCH (d)-[:ACTS_IN]->(m) 
RETURN d, collect(m) AS movies 

Beachten Sie, dass auf der Grundlage Ihrer ursprünglichen Frage, ich auch die return-Anweisung geändert haben.

+1

Sie können auch überprüfen, ob der Regisseur im Film als Teil des Prädikats fungiert hat. Anstelle des zweiten MATCH können Sie die WHERE-Klausel mit dem Muster fortsetzen, das Sie verwenden möchten: 'AND (d) - [: ACTS_IN] -> (m)' – InverseFalcon

0

Oh wow ich dachte, es einfach aus:

match (d:Director)-[:DIRECTED]->(m:Movie) 
match (d:Director)-[:ACTS_IN]->(m:Movie) 
where d.name STARTS WITH 'Q' 
return * 

ich ehrlich erwartete eine Art von Operator zu haben zu verwenden, um die beiden zu verbinden, aber ich glaube, ich war falsch.

+0

Sie können Ihrer 'where'-Klausel in der ersten Abfrage eine zusätzliche Bedingung hinzufügen, wie' und n = m', aber ja, es ist einfacher, die gleiche Variable zweimal zu verwenden. –

Verwandte Themen