当前位置: 首页 > article >正文

Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询

Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询

    • 查询需求分析
      • 目标查询结构
    • 编写 Cypher 查询
      • 查询解析
      • `OPTIONAL MATCH` 和 `COALESCE` 的作用
    • 在 Python 中使用 Neo4j 驱动执行查询
      • 使用 `neo4j` 驱动的 Python 示例代码
      • 代码解析
      • 示例输出
    • 总结

在使用 Neo4j 和 Cypher 查询语言时,我们经常会遇到一些复杂的查询需求,例如需要在匹配节点时考虑某些关系链中的部分节点是否存在。本文将通过一个实际的查询需求,向大家介绍如何使用 Cypher 中的 OPTIONAL MATCHCOALESCE 函数来处理这种情况,并使用 neo4j Python 驱动来执行查询。

查询需求分析

假设我们有一个图数据结构,包含以下三个节点类别:

  • 顧客:客户信息
  • 事例子分類:案例子分类
  • 事例分類:案例分类

目标是查询名称为 “ダミー会社” 的 顧客 节点,并返回与之关联的 事例子分類事例分類 节点。我们还需要确保即使 事例子分類 不存在,也能返回 顧客事例分類 的直接关系。

目标查询结构

理想的查询结果应包含以下两种情况:

  1. 完整的关系链:顧客 -> 事例子分類 -> 事例分類
  2. 简化的关系链:当 事例子分類 不存在时,返回 顧客 -> 事例分類

为实现这一需求,我们可以利用 OPTIONAL MATCH 处理可选节点,并通过 COALESCE 函数在结果中根据节点的存在情况选择优先显示的结果。

编写 Cypher 查询

经过分析,最终的 Cypher 查询代码如下:

MATCH (p:`顧客`)
WHERE p.name = 'ダミー会社'
OPTIONAL MATCH (p) <- [] - (n:`事例子分類`) <- [] - (m:`事例分類`)
WITH p, n, m
OPTIONAL MATCH (p) <- [] - (mAlt:`事例分類`)
WHERE n IS NULL
RETURN p, COALESCE(n, null) AS n, COALESCE(m, mAlt) AS m
LIMIT 1000

查询解析

  1. 主查询:使用 MATCH 匹配名称为 “ダミー会社” 的 顧客 节点 (p)

    MATCH (p:`顧客`)
    WHERE p.name = 'ダミー会社'
    
  2. 可选路径 1:顧客 -> 事例子分類 -> 事例分類

    OPTIONAL MATCH (p) <- [] - (n:`事例子分類`) <- [] - (m:`事例分類`)
    

    这里我们使用 OPTIONAL MATCH 来查找包含 事例子分類 节点的完整路径。如果该路径存在,则会填充 nm 的值,否则这两个变量为 null

  3. 保存中间查询结果

    WITH p, n, m
    

    使用 WITH 关键字保存当前的匹配结果,以便在后续的查询中继续使用 pnm

  4. 可选路径 2:直接匹配 顧客 -> 事例分類

    OPTIONAL MATCH (p) <- [] - (mAlt:`事例分類`)
    WHERE n IS NULL
    

    这一部分仅在第一条路径不存在时(即 n IS NULL)执行,再次尝试找到 顧客 节点和 事例分類 节点的直接关系,并将结果保存到 mAlt 中。

  5. 使用 COALESCE 函数返回结果

    RETURN p, COALESCE(n, null) AS n, COALESCE(m, mAlt) AS m
    

    在返回结果时,我们使用 COALESCE 函数选择优先返回非空值:

    • n 返回 事例子分類 节点(若不存在则返回 null)。
    • m 优先返回完整路径中的 事例分類 节点,如果不存在则使用直接匹配的 mAlt
  6. 限制返回数量

    LIMIT 1000
    

    使用 LIMIT 限制返回的结果数量,以防结果集过大。

OPTIONAL MATCHCOALESCE 的作用

  • OPTIONAL MATCH:允许在查询关系链中灵活处理可选节点,即便路径中有部分节点或关系缺失,查询依然能返回 null 作为占位。
  • COALESCE:在多个备选项中优先返回第一个非空值,是在结果中选择最优返回值的关键。

在 Python 中使用 Neo4j 驱动执行查询

我们可以使用 Python 的 neo4j 库来执行上述 Cypher 查询。假设 Neo4j 数据库已启动,且 Python 已安装 neo4j 驱动(可通过 pip install neo4j 安装),可以按以下步骤执行查询。

使用 neo4j 驱动的 Python 示例代码

以下代码展示了如何在 Python 中通过 neo4j 驱动执行查询,并返回结果。

from neo4j import GraphDatabase

# 配置 Neo4j 数据库连接
uri = "bolt://localhost:7687"
username = "username"
password = "password"

# 初始化驱动
driver = GraphDatabase.driver(uri, auth=(username, password))

# 定义查询
query = """
MATCH (p:`顧客`)
WHERE p.name = 'ダミー会社'
OPTIONAL MATCH (p) <- [] - (n:`事例子分類`) <- [] - (m:`事例分類`)
WITH p, n, m
OPTIONAL MATCH (p) <- [] - (mAlt:`事例分類`)
WHERE n IS NULL
RETURN p, COALESCE(n, null) AS n, COALESCE(m, mAlt) AS m
LIMIT 1000
"""

# 执行查询函数
def fetch_results(driver):
    with driver.session() as session:
        results = session.run(query)
        # 打印结果
        for record in results:
            print(record)

# 调用函数
fetch_results(driver)

# 关闭驱动
driver.close()

代码解析

  1. 数据库连接:使用 GraphDatabase.driver() 创建驱动对象,并提供数据库 URI 以及用户名和密码。
  2. 查询执行:定义 fetch_results 函数,在 with driver.session() as session 中创建一个会话,并使用 session.run(query) 来执行 Cypher 查询。
  3. 结果处理:循环遍历 results,并打印出每一条记录,展示匹配的 顧客事例子分類事例分類 节点。
  4. 关闭连接:用完数据库后,通过 driver.close() 关闭驱动以释放资源。

示例输出

假设数据库中有一个名称为 “ダミー会社” 的 顧客 节点,且该节点与一些 事例子分類事例分類 节点存在关联,那么运行代码后会输出类似的结果:

<Record p=<Node id=1 labels={'顧客'} properties={'name': 'ダミー会社'}> n=<Node id=2 labels={'事例子分類'} properties={'name': '分类A'}> m=<Node id=3 labels={'事例分類'} properties={'name': '分类总'}>>

如果没有 事例子分類,代码会返回 mAlt 中的直接匹配结果。

总结

通过灵活使用 Cypher 查询中的 OPTIONAL MATCHCOALESCE 函数,我们可以有效地处理复杂的查询需求,确保即使部分节点缺失,查询依然能够返回有效结果。希望本文的介绍能够帮助 Neo4j 和 Python 初学者更好地理解如何编写和优化 Cypher 查询,以及如何在 Python 中执行这些查询。


http://www.kler.cn/a/382998.html

相关文章:

  • RAG实战:构建基于本地大模型的智能问答系统
  • Spring源码_05_IOC容器启动细节
  • CI/CD是什么?
  • 【多时段】含sop的配电网重构【含分布式电源】【已更新视频讲解】
  • 基于推理的目标检测 DetGPT
  • [Android]按下扫描键时启动一个线程来执行某些操作
  • 摄影 4.8.7.2| 惊艳的摄影和修图软件,含教程和作品欣赏。
  • Node.js简介以及安装部署 (基础介绍 一)
  • JAVA基础【第四篇】
  • 在docker中搭建redis哨兵环境
  • 编译器优化乌龙——记一次死循环不进入问题
  • Elasticsearch Interval 查询:为什么它们是真正的位置查询,以及如何从 Span 转换
  • aitrader产品规划:数据自动下载,策略,因子挖掘,实盘对接,gui界面(源码+数据)
  • 重构代码之移动方法
  • 数据挖掘(六)
  • CentOS 9 Stream 上安装 Nginx
  • 【c知道】Hadoop工作原理。
  • 前后端交互接口(三)
  • 设置服务器ssh连接超时时间
  • 51单片机学习心得2(基于STC89C52):串口通信(UART)
  • 动态库实现lua网络请求GET, POST, 下载文件
  • 龙蜥副理事长张东:加速推进 AI+OS 深度融合,打造最 AI 的服务器操作系统
  • Java 中的 `wait()` 与 `sleep()`:深入解析两者的不同
  • SQLite数据库是什么?DB Browser for SQLite是什么?
  • Python 在PDF中绘制形状(线条、矩形、椭圆形等)
  • keep-alive - 2024最新版前端秋招面试短期突击面试题【100道】