1

我有一个 DSL 来查询 RedisGraph,它看起来像这样:

App::Graph.query(movie: { title: 'Matrix' }, country: { value: 'Italy' , value: 'Spain', value: 'Greece' })

产生这个密码查询:

MATCH (m:Movie)<-[:ACTED_IN]-(a:Actor)
WHERE m.title = 'Matrix'
WITH m, collect(a) as actors
WHERE 1 = 1
AND (movie)<-[:AVAILABLE_IN]-(:Country {value: 'Italy'})
AND (movie)<-[:AVAILABLE_IN]-(:Country {value: 'Spain'})
AND (movie)<-[:AVAILABLE_IN]-(:Country {value: 'Greece'})
RETURN actors, m

问题:在某些情况下,一个Country节点(例如西班牙)将没有edges,因此目前上述密码查询将正确地不返回任何结果。但是是否可以重写上面的查询,以便Country如果它没有边、匹配和返回连接到剩余的最初定义的国家列表(即意大利、希腊)的节点,它将忽略该节点?

我尝试了很多选项,下面是最后一个选项,但还没有找到实现这一目标的方法

MATCH (m:Movie)<-[:ACTED_IN]-(a:Actor)
WHERE m.title = 'Matrix'
WITH m, collect(a) as actors
MATCH (m)<-[:AVAILABLE_IN]-(connected_countries)
WHERE connected_countries.value IN ['Italy', 'Spain', 'Greece']
WITH m, actors, collect(connected_countries.value) as relevant_countries
WHERE 1 = 1
AND ((movie)<-[:AVAILABLE_IN]-(:Country {value: 'Italy'}) AND IN relevant_countries)
AND ((movie)<-[:AVAILABLE_IN]-(:Country {value: 'Spain'}) AND IN relevant_countries)
AND ((movie)<-[:AVAILABLE_IN]-(:Country {value: 'Greece'}) AND IN relevant_countries)
RETURN actors, m
4

1 回答 1

1

请试试:

MATCH (m:Movie {title:'Matrix'})
WITH m AS m
UNWIND ['Italy', 'Spain', 'Greece'] AS country_name
MATCH (:Country {value: country_name})-[:AVAILABLE_IN]->(m)<-[:ACTED_IN]-(a:Actor)
WITH m, collect(a) as actors
RETURN actors, m
于 2021-11-15T13:07:39.247 回答