neo4j(一)入门篇(3)
1、使用WHERE
MATCH(person:Person) WHERE person.name="Tom Hanks" RETURN person
相当于
MATCH(person:Person {name:"Tom Hanks"})
RETURN person
2、使用比较语句进行筛选
我们可以通过比较不同节点的属性值来进行筛选
筛选出和Tom Hanks在同一部电影中出演的演员并且该演员的年龄要大于Tom Hanks
MATCH(tom:Person)-[:ACTED_IN]->()<-(:ACTED_IN)-(actor:Person)
WHERE tom.name="Tom Hanks" AND
tom.born<actor.born
Return actor.name AS names
比较语句有>,<=,>=,<=,<>,=,is null is not null,{element} IN {LIST}
这里我们使用了()而没有在()中声明Movie,因为我们不关心他们共同出演的电影的名字。
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(movie:Movie),
(movie)<-[:ACTED_IN]-(actor:Person) // note how the line break doesn't break the query
WHERE actor.born < tom.born
RETURN DISTINCT actor.name AS Name, (tom.born - actor.born) AS diff
为将MATCH语句断开,我们可以使用中间变量movie来断开句子。同时我们可以显示年龄差异,在RETURN语句中使用一个表达式AS diff来显示年龄差异。
3、使用Patterns进行筛选
使用exists表示pattern存在,不存在NOT exists
如:我们要找与Gene Hackman在同一部电影中出演的演员同时又是导演的人
MATCH (p:Person)-[:ACTED_IN]->(movie:Movie), (actor:Person)-[:ACTED_IN]->(movie) WHERE p.name="Gene Hackman"
exists((actor)-[:DIRECTED]->()) RETURN DISTICT actor.name as Name
如要找和Gene Hackman同时出演电影的演员但是,Robin williams不在共同出演的电影中。
MATCH (gene:Person {name:"Gene Hackman"})-[:ACTED_IN]->(movie:Movie),
(other:Person)-[:ACTED_IN]->(movie),
(robin:Person {name:"Robin Williams"})
WHERE NOT exists( (robin)-[:ACTED_IN]->(movie) )
RETURN DISTINCT other
4、使用IN判断元素是否在列表中
如:找到Keanu Reeves扮演Neo角色的所有电影
MATCH (p:Person {name:"Keanu Reeves"})-[r:ACTED_IN]->(movie:Movie)
WHERE "NEO" IN r.roles
RETURN movie
5、比较paths
path是由一系列节点和关系组成的。
在Cypher中我们可以使用* 来代表可变长度的paths
MATCH (node1)-[*]-(node2)
- 遍历任何深度的关系是:
(a)-[*]->(b) - 特定的关系深度表示
(a)-[*depth]->(b)为找到所有路径的确切depth步长 - 从一级到四级深度的关系表示如下:
(a)-[*1..4]->(b) 类型KNOWS3级距离的关系:(a)-[:KNOWS*3]->(b)类型KNOWS或LIKES2级距离以上的关系:(a)-[:KNOWS|:LIKES*2..]->(b)
返回path
MATCH p=(actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person) RETURN p;
返回path意味着返回所有的节点和关系。
我们可以使用nodes(p)来仅仅返回节点,使用rels(p)来仅仅返回关系。
浙公网安备 33010602011771号