PROFIL EMATCH (m:Movie {title:'Jupiter Ascending'}) MATCH (d:Person)-[:DIRECTED]->(m) MATCH (a:Person)-[:ACTED_IN]->(m) RETURN m.title AS Title, collect(DISTINCT a.name) AS Actors,collect(DISTINCT d.name) AS Directors
优化
PROFILE MATCH (m:Movie {title:'Jupiter Ascending'}) MATCH (d:Person)-[:DIRECTED]->(m) WITH m, collect (d.name) AS Directors MATCH (a:Person)-[:ACTED_IN]->(m) RETURN m.title AS Title, collect(a.name) AS Actors, Directors
类似传统SQL将每部分添加查询条件得到最终结果
单个MATCH
PROFILE MATCH (d:Person)-[:DIRECTED]->(m:Movie {title:'Jupiter Ascending'})<-[:ACTED_IN]-(a:Person) RETURN m.title AS Title, collect(DISTINCT a.name) AS Actors,collect(DISTINCT d.name) AS Directors
收集节点
MATCH (m:Movie) UNWIND m.languages AS language WITH language, collect(m) AS movies MERGE (l:Language {name:language}) WITH l, movies UNWIND movies AS m WITH l,mMERGE (l)<-[:SPEAKS]-(m)
以作为 language 分组键,收集节点
使用 nodes() 返回路径中的节点列表。
MATCH path = (p:Person {name: 'Elvis Presley'})-[*4]-(a:Actor) WITH nodes(path) AS n UNWIND n AS x WITH x WHERE x:Movie RETURN DISTINCT x.title
收集关系
MATCH (u:User {name: "Misty Williams"})-[x]->() WITH collect(x) AS ratings UNWIND ratings AS r WITH r WHERE r.rating <= 1 RETURN r.rating AS Rating, endNode(r).title AS Title
使用 endNode() 返回关系末尾的节点。
与子查询
PROFILE MATCH (m:Movie)<-[:ACTED_IN]-(p:Person) WITH m, collect(p.name) AS Actors WHERE size(Actors) <= 3 RETURN m.title AS Movie, Actors
查询重写
PROFILE CALL { MATCH (m:Movie)<-[:ACTED_IN]-(p:Person) WITH m , collect(p.name) as Actors WHERE size(Actors)<= 3 RETURN m.title as Movie, Actors } RETURN Movie, Actors
使用 count()
可以在查询处理期间对属性、节点、关系、路径或行进行计数。
MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person) RETURN a.name AS ActorName,d.name AS DirectorName,count(*) AS NumMovies, collect(m.title) AS Movies ORDER BY NumMovies DESC
在属性值上使用
MATCH (p:Person) RETURN count(p) , count(p.born),count(p.name)
此查询看到 born 的计数与其它不同,说明节点中无 born 属性
作为过滤查询的子句
MATCH (a:Person)-[:ACTED_IN]->(m:Movie) WITH a, count(*) AS NumMovies, collect(m.title) AS Movies WHERE NumMovies = 2 RETURN a.name AS Actor,Movies
计算节点数
MATCH (p:Person {name: 'Elvis Presley'})-[]-(m:Movie)-[]-(a:Actor) RETURN count(*), count(m), count (a)
使用模式理解
模式理解的行为类似于使用 OPTIONAL MATCH,并且对于这个特定的查询,经过的时间减少了。
原
PROFILE MATCH(m:Movie) WHERE m.year = 2015 OPTIONAL MATCH (a:Person)-[:ACTED_IN]-(m) WITH m, collect(DISTINCT a.name) AS Actors OPTIONAL MATCH (m)-[:DIRECTED]-(d:Person) RETURN m.title AS Movie, Actors, collect (DISTINCT d.name) AS Directors
模式
PROFILE MATCH (m:Movie) WHERE m.year = 2015 RETURN m.title AS Movie,[(dir:Person)-[:DIRECTED]->(m) | dir.name] AS Directors,[(actor:Person)-[:ACTED_IN]->(m) | actor.name] AS Actors
模式理解条件的过滤
MATCH (a:Person {name: 'Tom Hanks'}) RETURN [(a)--(b:Movie) WHERE b.title CONTAINS "Toy" | b.title ]AS Movies
返回的列表添加更多属性(相当于Oracle中的合并列)
相当于不重复属性的collect(),注:模式理解下的属性可能为0,所有用size()定义
MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) WHERE 2000 <= m.year <= 2005 AND a.born.year >= 1980 RETURN a.name AS Actor, a.born AS Born,collect(DISTINCT m.title) AS Movies ORDER BY Actor
MATCH (a:Actor) WHERE a.born.year >= 1980 WITH a, [(a)-[:ACTED_IN]->(m:Movie) WHERE 2000 <= m.year <= 2005 | m.title] AS Movies WHERE size(Movies) > 0 RETURN a.name as Actor, a.born as Born, Movies
MATCH (a:Person {name: 'Tom Hanks'}) RETURN [(a)--(b:Movie) WHERE b.title CONTAINS "Toy" | b.title + ": " + b.year] AS Movies