Cypher 初学者指南

Knowledge Grahp(KG) 可用于表示现实世界中的不同实体网络并对其关系进行建模,例如:基于人和人的关系构建的社交网络图,基因与蛋白质之间的关系图…… KG 代表了一种理解数据的思维范式的转变,这有助于我们理解数据之间的关系,以便我们能够轻松识别数据中隐藏的重要模式并做出更好的决策。尤其是在生成式 LLM 快速发展的今天,KG 可以作为一种结构化的知识表示方式,为 LLM 提供更准确、更丰富、更精简的上下文信息,从而提升 LLM 的性能。

图数据库与 Neo4j 简介

传统的关系型数据库(RDBMS)使用表(table)来存储数据,并通过外键(foreign key)在不同的表之间链接数据。而图数据库(Graph Database)则用节点(Node)和关系(Relationship)来存储数据,对于网络、社交关系、知识图谱等复杂关联的数据表示具有天然的优势。

Neo4j 是当前最流行的图数据库之一,Neo4j 中的基本概念包括:

  • 节点 (Node): 图中的实体,用 () 表示
  • 标签 (Labels): 节点的分类,如 :Person, :Movie
  • 属性 (Properties): 节点和关系的键值对数据,(如 {name: "Alice", age: 30})
  • 关系 (Relationship): 连接节点的边,可以有方向和类型(如 ACTED_IN、FRIEND_OF),用 --> 或 -[]->表示

Alice 是 Bob 的朋友,在 Neo4j 中可以表示为:

1
(Alice:Person)-[:FRIEND_OF]->(Bob:Person)

Neo4j Desktop 安装与使用

对于初学者,建议直接安装 Neo4j Desktop 版本,Neo4j Desktop 是 Neo4j 官方推出的桌面应用程序(支持 Windows、Mac、Linux 等多个平台),专为简化图形数据库的管理、开发和学习而设计,尤其适合开发者、数据分析师和初学者。其核心优点如下:

  • 一站式图形数据库管理

    • 便捷的数据库生命周期管理:可直接在界面中创建、启动、停止、删除 Neo4j 数据库(支持社区版和企业版),无需手动配置命令行或服务器参数。
    • 多版本兼容:支持同时管理多个不同版本的 Neo4j 数据库,方便测试不同版本的特性或兼容性。
    • 直观的状态监控:通过仪表盘实时显示数据库的运行状态(如内存占用、连接数、查询性能等),便于快速排查问题。
  • 集成开发环境(IDE)级体验

    • 内置 Neo4j Browser:无需额外安装,直接在桌面端打开图形化查询工具 Neo4j Browser,支持编写、运行 Cypher 语句,并以图形化、表格或文本形式展示结果,可视化效果直观。
    • 项目管理功能:可将数据库、查询脚本、文档等资源归类到 “项目” 中,便于多任务场景下的资源组织(如不同业务场景的数据库隔离)。
    • 语法高亮与自动补全:Cypher 语句编辑时支持语法高亮、关键字提示和自动补全,减少语法错误,提升编写效率。
  • 降低入门与学习门槛

    • 零配置快速启动:无需手动安装 JDK、配置环境变量或修改复杂的配置文件,下载后即可一键创建并启动数据库,新手可快速上手。
    • 内置示例数据库:提供多个预配置的示例项目(如电影数据库、社交网络示例),包含现成的节点、关系和查询案例,便于通过实际数据学习 Cypher 和图形数据模型。
    • 文档与教程集成:内置官方文档入口和学习资源链接,方便随时查阅语法、最佳实践和场景案例。
  • 支持扩展与集成

    • 插件与应用市场:可通过 “应用市场” 安装扩展工具(如数据导入插件、可视化工具),扩展功能边界。
    • 外部工具集成:支持将数据库连接到外部应用(如 Python、Java 程序),或与其他工具(如 Jupyter Notebook)联动,方便开发和数据分析流程。

安装 Neo4j Desktop 后,我们可以创建一个新的数据库实例,并通过内置的 Neo4j Browser 编写和运行 Cypher 语句。

注意事项

由于 Neo4j Desktop 封禁了中国区的访问,因此安装完成后可能会出现:

  • 打开应用不显示应用界面(Neo4j Desktop 1.x 版本)
  • 无法创建数据库实例(Neo4j Desktop 2.x 版本)的情况

此时,可以通过配置代理的方式来解决该问题。

Cypher 语言简介

Cypher 是 Neo4j 的声明式图查询语言,类似 SQL,但专为图模型设计,其基本语法特点如下:

  • 节点用圆括号 () 表示
  • 关系用方括号 [] 表示
  • 箭头 -> 或 <- 表示关系方向
  • 属性用花括号 {} 表示
  • 标签用冒号 : 表示

创建节点和关系

1
2
CREATE (p1:Person {name: "Alice", age: 30}), 
(p2:Person {name: "Bob", age: 17})
1
2
MATCH (a:Person {name: "Alice"}), (b:Person {name: "Bob"})
CREATE (a)-[:FRIEND_OF]->(b)

查询节点和关系

1
2
MATCH path=(:Person)-[:FRIEND_OF]->(:Person) 
RETURN path

条件查询

1
2
3
MATCH (p:Person) 
WHERE p.age > 18
RETURN p

属性设置与更新

1
2
3
4
5
6
7
MATCH (p1:Person {name: "Alice"})
SET p1.gender = "female"

MATCH (p2:Person {name: "Bob"})
SET p2.gender = "male"

RETURN p1, p2

删除节点和关系

DETACH DELETE 会同时删除节点及其所有关系。

1
2
MATCH (p:Person {name: "Alice"})
DETACH DELETE p

Cypher 语法速查表

Neo4j Cypher 语法速查表

更多的 Cypher 语法可以参考 Neo4j Cypher 语法速查表。

HPO(The Human Phenotype Ontology)

人类表型本体论(HPO) 提供了一套标准化的词汇,用于描述人类疾病中出现的表型异常。HPO 是 Monarch Initiative 的核心成果,致力于生物医学和模式生物数据的语义整合,其最终目标是推动生物医学研究的发展。作为 Monarch Initiative 的一部分,HPO 是全球基因组与健康联盟(GA4GH)战略路线图中的 13 个驱动项目之一的核心组成部分。HPO 中的每个术语都描述了一种表型异常,例如房间隔缺损。HPO 目前包含超过 18,000 个术语,以及超过 156,000 个与遗传性疾病相关的注释。目前,借助 HPO 项目及其他相关项目,人们已经开发出用于表型驱动的鉴别诊断、基因组诊断和转化医学研究的相关软件。

接下来,我们将利用 HPO 数据构建一个简单的 KG,并使用 Cypher 查询语句对其进行探索。

Neo4j 插件安装

在 Knowledge Graphs And LLMs in Action 一书中,提供了根据 HPO 数据构建 KG 的代码示例(chapter_03_code)。我们可以使用该代码来构建 HPO KG。

该代码使用了 Neo4j 的 APOC 插件和 neosemantics 插件,因此,在运行代码之前,我们需要确保 Neo4j Desktop 中安装了这两个插件。

Neo4j Desktop 中的插件中心提供了 APOC 插件,我们直接安装即可,但是 neosemantics 插件需要手动安装。我们可以从 neosemantics GitHub 仓库 下载插件的 .jar 文件,并将其放置在 Neo4j Desktop 的 plugins 目录下。

插件安装完毕后,我们需要修改 Neo4j 的配置文件,以允许 APOC 和 neosemantics 插件访问数据库。通过 Neo4j Desktop 插件中心安装的插件会自动增加这些配置项,但是如果是手动安装的插件(例如 neosemantics),我们需要手动添加以下配置到 Neo4j 的 neo4j.conf 文件中:

1
2
3
4
5
6
7
# A comma separated list of procedures and user defined functions that are allowed
# full access to the database through unsupported/insecure internal APIs.
dbms.security.procedures.unrestricted=gds.*,n10s.*

# A comma separated list of procedures to be loaded by default.
# Leaving this unconfigured will load all procedures found.
dbms.security.procedures.allowlist=gds.*,n10s.*,apoc.*

然后重启 Neo4j 数据库实例,使配置和插件生效。

构建 HPO KG

按照 chapter_03_code 中的说明,我们可以构建 HPO KG。

python 版本问题

务必注意,执行代码需要使用 3.10 以下的 python 版本。否则,会报如下的错误:

1
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?

1
$ /usr/bin/python3 chapters/ch03/importer/import_hpo.py

执行上述命令后,我们就把 HPO 数据导入到 Neo4j 数据库中,并形成了一个简单的 KG。

查询 HPO KG

我们现在想要查询一下,与 1 型糖尿病(Diabetes Mellitus Type 1)关联的表型特征(Phnotypic Feature)。我们可以使用以下 Cypher 查询语句:

1
2
3
MATCH path=(dis:HpoDisease)-[:HAS_PHENOTYPIC_FEATURE]->(pho:HpoPhenotype)
WHERE dis.id = "OMIM:222100"
RETURN path

在如上的查询中,我们得到了与 1 型糖尿病 相关的表型特征。那么,作为一个临床医生而言,他们还想要知道,有哪些疾病还会与这些表型特征相关联。我们可以使用以下 Cypher 查询语句:

1
2
3
4
5
MATCH path=(dis:HpoDisease)-[:HAS_PHENOTYPIC_FEATURE]->(phe:HpoPhenotype)
WHERE dis.id = "OMIM:222100"
WITH phe AS Type_1_Diabetes_Phe, path AS Type_1_Diabetes_Path
MATCH path = (dis:HpoDisease)-[:HAS_PHENOTYPIC_FEATURE]->(Type_1_Diabetes_Phe)
RETURN Type_1_Diabetes_Path, path

我们还可以继续查询,在和 1 型糖尿病 相关的表型特征中有关联的疾病中,这些疾病有这些表型特征的特征个数,并按照所包含的特征个数的多少进行降序排列。

1
2
3
4
5
6
7
8
9
10
11
MATCH path=(dis:HpoDisease)-[:HAS_PHENOTYPIC_FEATURE]->(phe:HpoPhenotype)
WHERE dis.id = "OMIM:222100"
WITH phe AS Type_1_Diabetes_Phe, path AS Type_1_Diabetes_Path
MATCH path = (dis:HpoDisease)-[:HAS_PHENOTYPIC_FEATURE]->(Type_1_Diabetes_Phe)
UNWIND dis AS nodes
RETURN dis.id AS disease_id,
dis.label AS disease_name,
collect(Type_1_Diabetes_Phe.label) AS features,
COUNT(nodes) AS num_of_features
ORDER BY num_of_features DESC, disease_name
LIMIT 5

从如上的结果中,我们能看出,在与 1 型糖尿病 相关的 8 个表型特征中,Bardet-Biedl syndrome 2 疾病包含了其中的 3 个表型特征。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2026 Wang Wei
  • 本站访问人数: | 本站浏览次数:

请我喝杯咖啡吧~

微信