图数据库 Cypher 查询语言的子查询 CALL (subquery)

目录

子查询允许将查询组合起来,这在使用UNION或聚合时特别有用。

子查询与封闭查询交互的方式有一些限制:

  • 子查询只能引用外部查询中显式导入的变量。
  • 子查询不能返回与外围查询中变量名称相同的变量。
  • 从子查询返回的所有变量随后都可在外部查询中使用。

WITH导入变量进子句必须:

  • 只包含对外部变量的简单引用,例如WITH x, y, z。导入WITH子句时不支持别名或表达式,例如~~WITH a AS b~~~~WITH a+1 AS b~~
  • 是子查询的第一个子句(如果直接跟在USE子句后面,则是第二个子句)。

官方例子:

MATCH (p:Person)
CALL {
  WITH p
  MATCH (p)-[:FRIEND_OF]-(c:Person)
  RETURN c.name AS friend
}
RETURN p.name, friend

# 不返回任何行的单元子查询,会产生副作用
MATCH (p:Person)
CALL {
  WITH p
  UNWIND range (1, 5) AS i
  CREATE (:Person {name: p.name})
}
RETURN count(*)

我的举例:

# 查询医生兼职的组织数量的最大值
MATCH (n:Doctor)
CALL {
    WITH n
    MATCH (n) -[:WORK_IN]-> (e:Organization)
    RETURN count(n) as cnt
}
RETURN max(cnt)

# 查询医生工作医院、科室、组织的职位数量的最大值
MATCH (n:Doctor)
CALL {
    WITH n
    CALL {
        WITH n
        MATCH (n) -[r1:WORK_IN]-> (e:Organization)
        WHERE r1.position is not NULL
        RETURN count(r1) as cnt1
    }
    CALL {
        WITH n
        MATCH (n) -[r1:WORK_IN]-> (e:Hospital)
        WHERE r1.position is not NULL
        RETURN count(r1) as cnt2
    }
    CALL {
        WITH n
        MATCH (n) -[r1:WORK_IN]-> (e:Department)
        WHERE r1.position is not NULL
        RETURN count(r1) as cnt3
    }
    RETURN cnt1 + cnt2 + cnt3 AS cnt
}
RETURN max(cnt) as max_cnt

# 查找众数:计数+排序
MATCH (d:Doctor)
CALL {
    WITH d
    RETURN d.clinicProfessional AS cp
}
RETURN d.clinicProfessional, count(cp)

Untitled

典型应用场景:需要结果的不同部分进行不同匹配,然后在整个结果上做一个汇总,比如查询每个人的朋友数量。

WITH 给我的感觉就像是 SQL 中的 WITH 给子查询起别名一样

子查询的作用:子查询可用于对每一行进行汇总

参考文献

Neo4j 版本4 新特性介绍 - Cypher [1] CALL 子查询_neo4j call_俞博士的博客-CSDN博客

The Neo4j Cypher Manual v5 - Cypher Manual

标签 :

相关文章

最小生成树

最小生成树:Kruskal算法和Prim算法的实现 这里直接给出离散数学中的几个定理和推论: 无向图G具有生成树当且仅当G连通. G为n阶m条边的无向连通图,则 m >= n - 1. G是树 $\Leftrightarrow$ G中任意两个顶点之间存在唯一路径 $\Leftrightarrow$ G中无回路且m=n-1$\Leftrightarrow$ G是连通的且m=n-1$\Leftrightarrow$ G中没有回路但在任何2个不同的顶点间加一条新边就能在图中得到唯一的含新边的环圈. 生成子图指的是顶点集相同,但边集是图G的子集的图. 生成树指的是图G的生成子图并且是树. 最小生成树指的是图G的所有生成树中权最小的. 算法第4版中这样定义:

阅读更多
如何在 React 中进行状态管理?使用 Zustand!

计数器 import { create } from 'zustand' const useStore = create(set => ({ count: 1, inc: () => set(state => ({ count: state.count + 1 })), })) function Controls() { const inc = useStore(state => state.inc) return <button onClick={inc}>one up</button> } function Counter() { const count = useStore(state => state.count) return <h1>{count}</h1> } 用法 创建状态 state 操作 action Basic typescript usage doesn’t require anything special except for writing create<State>()(...) instead of create(...)… import { create } from 'zustand' interface BearState { bears: number increase: (by: number) => void } const useBearStore = create<BearState>()((set) => ({ bears: 0, increase: (by) => set((state) => ({ bears: state.bears + by })), })) const useFishStore = create((set) => ({ salmon: 1, tuna: 2, deleteEverything: () => set({}, true), // clears the entire store, actions included deleteTuna: () => set((state) => omit(state, ['tuna']), true), })) const useSoundStore = create((set, get) => ({ sound: "grunt", action: () => { const sound = get().sound // you still have access to state outside of it through get // ... } }) export default useBearStore 在 react 之外使用呢?

阅读更多
用 Logseq 记笔记,从此 Networked Thinking!

attention(2023.01.07):成文时 Logseq 0.8.15 update(2023.01.11): 将 OKR 一节重写,给出 :current-page 不稳定的一个比较麻烦的解决办法。 update(2023.01.13): 已有开源贡献者着手修复该问题,:current-page 后续应该能正常使用。 🤔动机 出于数据云上不在我手上的担忧,需要一款开源本地笔记软件,最好能通过 Git 管理源文件,还能给我提供一种记笔记的新思路。

阅读更多