如何在Cypher / Neo4j中使用WHERE子句

时间:2017-02-10 18:04:39

标签: neo4j cypher

我在Neo4j上构建了这个数据库

enter image description here

我试图找到在基努·里维斯也演过的电影中演过的演员。我的代码是:

MATCH (a:Actor)-[r:ACTS_IN]->(m:Movie)
WHERE (m:Movie)<-[r:ACTS_IN]-(:Actor { name:"Keanu Reeves" })
RETURN a.name

但它不起作用。我是这种语言的新手,我甚至不确定是否应该使用WHERE或WITH或其他内容。

2 个答案:

答案 0 :(得分:3)

您的查询在rMATCH子句中使用相同的标识符WHERE。这意味着2 ACTS_IN关系应该是相同的。因此,a始终是Keanu Reeves的节点。

这种形式的查询应该返回所有相关的演员(包括基努),但可能不会非常高效:

MATCH (a:Actor)-[r:ACTS_IN]->(m:Movie)
WHERE (m)<-[:ACTS_IN]-(:Actor { name:"Keanu Reeves" })
RETURN DISTINCT a.name;

此查询应该更快(并从结果中消除Keanu),特别是如果您首先在:Actor(name)上创建索引:

MATCH (a:Actor)-[:ACTS_IN]->(:Movie)<-[:ACTS_IN]-(:Actor { name:"Keanu Reeves" })
RETURN DISTINCT a.name;

答案 1 :(得分:1)

首先:找到基努采取的电影列表。

第二名: WITH基努和每部电影都会找到那些不是基努的电影中的其他演员。

第三:返回他在电影列表中表现出色的基努的同事名单

match (k:Actor {name: 'Keanu Reeves'})-[r:ACTS_IN]->(m:Movie)
with k,m
match (m)<-[:ACTS_IN]-(colleague:Actor)
where colleague <>  k
return distinct(colleague)