- 图遍历
- 在 Neo4j 中,关系的唯一性始终得到遵守。即两个节点之间永远不会有两个相同类型和方向的关系。这使 Neo4j 能够避免图形遍历中的循环或无限循环。
- 使用多个 Match 子句和多个模式的查询
- 性能分析 PROFILE
- 加入PROFILE的查询语句将占用更多的资源,所以除非真正在做性能分析,否则不要使用PROFILE。
- 分析路径常用函数
- 返回路径的长度。
- length(p)
- MATCH p = ((person:Person)-[]->(movie)) WHERE person.name = 'Walt Disney' RETURN p
- length(p)
- 返回包含路径节点的列表。
- nodes(p)
- 返回包含路径关系的列表。
- relationships(p)
- 返回路径的长度。
- 路径
- 寻找两个节点之间的最短路径。
- 最短路径(无限制关系类型)
- 限制特定的关系类型
- 对于shortestPath()和allShortestPaths(),可以提供路径长度的上限,但不能提供下限。
- 使用 ACTED_IN 关系检索与 Eminem 恰好两跳距离的所有 Person 节点。
- MATCH (p:Person {name: 'Eminem'})-[:ACTED_IN*2]-(others:Person) RETURN others.name
- 使用 ACTED_IN 关系检索与 Eminem 恰好四跳距离的所有 Person 节点。
- MATCH (p:Person {name: 'Eminem'})-[:ACTED_IN*4]-(others:Person) RETURN others.name
- 使用 ACTED_IN 关系检索距离 Eminem 最多四跳的所有 Person 节点。
- MATCH (p:Person {name: 'Eminem'})-[:ACTED_IN*1..4]-(others:Person) RETURN others.name
- 找出图中节点彼此“接近”的程度。
- 寻找两个节点之间的最短路径。
- 参数
- 查询的范围变量(类似于Oracle中的定义变量)
- 使用 WITH 子句定义和初始化要在查询中使用的变量。
- WITH 'Tom Hanks' AS actorName MATCH (p:Person)-[:ACTED_IN]->(m:Movie) WHERE p.name = actorName RETURN m.title AS movies
- 使用WITH子句作用域变量
- WITH 'toy story' AS mt, 'Tom Hanks' AS actorName MATCH (p:Person)-[:ACTED_IN]->(m:Movie) WITH m, toLower(m.title) AS movieTitle WHERE p.name = actorName AND movieTitle CONTAINS mt RETURN m.title AS movies, movieTitle
- 如果您要删除第二WITH个子句中的 m,查询将无法编译。(返回节点的属性则在 WITH 中要定义节点)
- 限制结果
- Return 后加 Limit
- WITH 'Tom Hanks' AS theActor MATCH (p:Person)-[:ACTED_IN]->(m:Movie) WHERE p.name = theActor RETURN m.title AS movies LIMIT 2
- WHERE 后使用 WITH 子句
- WITH 'Tom Hanks' AS theActor MATCH (p:Person)-[:ACTED_IN]->(m:Movie) WHERE p.name = theActor WITH m ORDER BY m.year LIMIT 2 RETURN m.title AS movies
- Return 后加 Limit
- WITH子句中嵌套子句
- MATCH (n:Movie) WHERE n.imdbRating IS NOT NULL AND n.poster IS NOT NULL WITH n { .title, .year, .languages, .plot, .poster, .imdbRating, directors: [ (n)<-[:DIRECTED]-(d) | d { tmdbId:d.imdbId, .name } ]} ORDER BY n.imdbRating DESC LIMIT 4 RETURN collect(n)
- WITH 后已经聚合属性值,RETURN再使用别名用反引号
- MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[r:RATED]-(:User) WHERE p.name = 'Tom Hanks' WITH m, avg(r.rating) AS avgRating RETURN m.title AS Movie, avg Rating AS `AverageRating` ORDER BY avgRating DESC
- 使用 UNWIND 子句定义使用的变量
- 为列表的每一列返回一行(列转行)
- MATCH (m:Movie)-[:ACTED_IN]-(a:Actor) WHERE a.name = 'Tom Hanks' UNWIND m.languages AS lang RETURN m.title AS movie,m.languages AS languages,lang AS language
- MATCH (m:Movie) UNWIND m.countries AS country WITH m, trim(country) AS trimmedCountry WITH trimmedCountry, collect(m.title) AS movies RETURN trimmedCountry, size(movies)
- 为列表的每一列返回一行(列转行)
图遍历详解
于 2023-02-22 17:21:03 首次发布