图遍历详解

  • 图遍历
    • 在 Neo4j 中,关系的唯一性始终得到遵守。即两个节点之间永远不会有两个相同类型和方向的关系。这使 Neo4j 能够避免图形遍历中的循环或无限循环。
    • 使用多个 Match 子句和多个模式的查询
    • 性能分析 PROFILE
      • 加入PROFILE的查询语句将占用更多的资源,所以除非真正在做性能分析,否则不要使用PROFILE。
    • 分析路径常用函数
      • 返回路径的长度。
        • length(p)
          • MATCH p = ((person:Person)-[]->(movie)) WHERE person.name = 'Walt Disney' RETURN p

      • 返回包含路径节点的列表。
        • nodes(p)
      • 返回包含路径关系的列表。
        • relationships(p)
    • 路径
      • 寻找两个节点之间的最短路径。
        • 最短路径(无限制关系类型)
          • MATCH p = shortestPath((p1:Person)-[*]-(p2:Person)) WHERE p1.name = "Eminem" AND p2.name = "Charlton Heston" RETURN p

        • 限制特定的关系类型
          • MATCH p = shortestPath((p1:Person)-[:ACTED_IN*]-(p2:Person)) WHERE p1.name = "Eminem" AND p2.name = "Charlton Heston" RETURN 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
        • 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值