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

news/2024/11/8 7:37:22 标签: neo4j, python, 数据库

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__86">使用 neo4j 驱动的 Python 示例代码

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

python">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.niftyadmin.cn/n/5743521.html

相关文章

漏洞分析 | Spring Framework路径遍历漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美国威睿&#xff08;VMware&#xff09;公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。 近期&#xff0c;网宿安全演武实验室监测到Spring Framework在特定条件下&#xff0c;存在目录遍历漏洞&…

【SQL实验】高级查询(难点.三)含附加数据库操作

完整代码在文章末尾【代码是自己的解答&#xff0c;并非标准答案&#xff0c;也有可能写错&#xff0c;文中可能会有不准确或待完善之处&#xff0c;恳请各位读者不吝批评指正&#xff0c;共同促进学习交流】 将素材中的“学生管理”数据库附加到SQL SERVER中&#xff0c;完成以…

简单了解一下 TypeScript 的泛型

在 TypeScript (TS) 中&#xff0c;泛型是一个强大且灵活的工具&#xff0c;用于编写具有更高可复用性和类型安全性的代码。泛型允许我们在声明时将类型作为参数传入&#xff0c;使函数、接口和类能在不同的数据类型下复用&#xff0c;而无需重新编写逻辑。 1. 泛型的基本语法…

论文《基于柔顺控制的智能神经导航手术机器人系统设计》文献阅读分析报告

论文报告&#xff1a;基于卷积神经网络的手术机器人控制系统设计 摘要 本研究针对机器人辅助微创手术中定向障碍和缺乏导航信息的问题&#xff0c;设计了一种智能控制导航手术机器人系统。该系统采用可靠和安全的定位技术、7自由度机械臂以及避免关节角度限制的逆运动学控制策…

Android CCodec Codec2 (二十)C2Buffer与Codec2Buffer

在阅读Codec2框架代码时&#xff0c;我们可能会发现好几个名称中都带有“buffer”的类&#xff0c;如MediaCodecBuffer、ABuffer、CCodecBuffers、Codec2Buffer以及C2Buffer。它们分别是什么&#xff1f;各自承担着什么功能&#xff1f;它们之间有何联系&#xff1f;本文将围绕…

macos中安装和设置ninja

1、在安装ninja的过程中需要先安装re2c(github地址&#xff1a;https://github.com/skvadrik/re2c): git clone https://github.com/skvadrik/re2c.git&#xff08;也可直接下载最新的release压缩包&#xff0c;并解压。下载地址&#xff1a;https://github.com/skvadrik/re2c…

[论文阅读]Secure IP Address Allocation at Cloud Scale

Secure IP Address Allocation at Cloud Scale http://arxiv.org/abs/2210.14999 NDSS - Network and Distributed Systems Security Symposium (2025) 随着云计算和云基础设施的广泛应用&#xff0c;云服务提供商必须管理大量的网络资源&#xff0c;其中IP地址分配是重要的…

【Linux】Linux下查看cpu信息指令(top/mpstat/iostat/pidstat)说明

top命令 top(1) - Linux manual page (man7.org) top查看总的CPU利用率 us: 用户空间消耗的CPU资源占比&#xff0c;进程在用户态执行函数调用&#xff0c;编解码消耗的都是us sy: 内核空间消耗的CPU资源占比&#xff0c;进程调用系统调用达到内核后会增加sy的消耗 ni&…