FOREACH语句与CALL{}子查询

Neo4j 同时被 3 个专栏收录
70 篇文章 1 订阅
38 篇文章 1 订阅
1 篇文章 0 订阅


Here’s the table of contents:

FOREACH语句与CALL{}子查询

需要从邻接表中生成一些数据,可以分别使用FOREACH和CALL{}子查询【Neo4j-4.x中新增的功能】实现从邻接表创建数据。

一、邻接表数据样例

邻接表是实现图算法时常用的一种数据结构。

在这里插入图片描述

二、使用FOREACH

FOREACH关键字可以实现对列表数据的迭代处理。

2.1 创建数据

WITH {`0`: [7, 9], `1`: [2, 4, 5, 6, 8, 9], `2`: [0, 6, 8, 9], `3`: [1, 2, 6, 9], `4`: [1, 2, 3, 7], `5`: [8, 9], `6`: [2, 4, 5, 7, 8, 9], `7`: [0, 3, 4, 6, 8, 9], `8`: [1, 6, 9], `9`: [0, 1, 3, 5]} AS list
UNWIND keys(list) AS key
MERGE (n:节点 {id: toInteger(key)})
FOREACH(item IN list[key] |
  MERGE (m:节点 {id: item})
  MERGE (n)-[:连接]->(m)
)
RETURN n.id;

在这里插入图片描述

2.2 输出统计值

WITH {`0`: [7, 9], `1`: [2, 4, 5, 6, 8, 9], `2`: [0, 6, 8, 9], `3`: [1, 2, 6, 9], `4`: [1, 2, 3, 7], `5`: [8, 9], `6`: [2, 4, 5, 7, 8, 9], `7`: [0, 3, 4, 6, 8, 9], `8`: [1, 6, 9], `9`: [0, 1, 3, 5]} AS list
UNWIND keys(list) AS key
MERGE (n:节点 {id: toInteger(key)})
WITH n, key, list
UNWIND list[key] AS item
MERGE (m:节点 {id: item})
MERGE (n)-[:连接]->(m)
RETURN n.id, count(*);

在这里插入图片描述

三、使用CALL{}

关于CALL聚合子查询:Aggregation and side-effects

CALL{}子查询对于每一行数据进行聚合和隔离操作很有用。如果查询中存在复杂的UNWIND操作或者其它复杂操作,该功能是非常实用的。

WITH {`0`: [7, 9], `1`: [2, 4, 5, 6, 8, 9], `2`: [0, 6, 8, 9], `3`: [1, 2, 6, 9], `4`: [1, 2, 3, 7], `5`: [8, 9], `6`: [2, 4, 5, 7, 8, 9], `7`: [0, 3, 4, 6, 8, 9], `8`: [1, 6, 9], `9`: [0, 1, 3, 5]} AS list
UNWIND keys(list) AS key
MERGE (n:节点 {id: toInteger(key)})
WITH n, key, list
CALL {
  WITH key, n, list
  UNWIND list[key] AS item
  MERGE (m:Node {id: item})
  MERGE (n)-[:连接]->(m)
  RETURN count(*) AS count
}
RETURN n.id, count

在这里插入图片描述

四、对邻接表数据进行路径分析

在这里插入图片描述
经历过第节以后,在第节中定义的邻接表数据已经生成到图数据库中了,下面对这张图进行路径分析。

4.1 全路径解析

将邻接表中所有的路径ID解析出来,其中*表示全路径查找

MATCH path = (:节点)-[:连接*]->(next:节点)
RETURN [t in NODES(path) | t.id] AS allIds
╒═══════════════════════╕
│"allIds"               │
╞═══════════════════════╡
│[2,0]                  │
├───────────────────────┤
│[3,2,0]                │
├───────────────────────┤
│[4,3,2,0]              │
├───────────────────────┤
│[6,4,3,2,0]            │
├───────────────────────┤
......

在这里插入图片描述

4.2 最长路径查找

获取与没有出度的节点可以组合的所有最长路径,通过路径节点的数量即可得到最长路径结果。

MATCH path = (:节点)-[:连接*]->(next:节点)
WHERE NOT ((next)-[:连接]->())
RETURN [t in NODES(path) | t.id] AS allIds
// 获取最长路径
// MATCH path = (:节点)-[:连接*]->(next:节点)
// WHERE NOT ((next)-[:连接]->())
// WITH [t in NODES(path) | t.id] AS allIds
// RETURN allIds,SIZE(allIds) AS size ORDER BY size DESC LIMIT 100
╒═════════════════════════╕
│"allIds"                 │
╞═════════════════════════╡
│[4,7]                    │
├─────────────────────────┤
│[6,4,7]                  │
├─────────────────────────┤
│[3,6,4,7]                │
├─────────────────────────┤
│[4,3,6,4,7]              │
├─────────────────────────┤
│[1,4,3,6,4,7]            │
├─────────────────────────┤
......

在这里插入图片描述

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值