neo4j 图数据库:Cypher 查询语言、医学知识图谱

neo4j 图数据库:Cypher 查询语言、医学知识图谱

    • Cypher 查询语言
      • 创建数据
      • 查询数据
        • 查询并返回所有节点
        • 查询并返回所有带有特定标签的节点
        • 查询特定属性的节点及其所有关系和关系的另一端节点
        • 查询从名为“小明”的节点到名为“小红”的节点的路径
      • 更新数据
        • 更新一个节点的属性
        • 添加新属性
        • 更新关系的属性
      • 删除数据
        • 删除节点
        • 删除关系
        • 删除属性
      • 三元组导入知识图谱
        • 对于 `kg_triples_small.txt`
        • 对于 `CPubMed-KGV_1.1.txt`
        • 深度级联查询 - 获取全面的症状-疾病网络
      • Python 交互 Neo4j
        • 步骤 1: 安装 Neo4j Python 驱动程序
        • 步骤 2: 建立连接
        • 步骤 3: 执行查询
        • 步骤 4: 处理事务
        • 步骤 5: 关闭驱动
      • 查询性能优化
        • 使用索引
        • 合理使用标签
        • 优化Cypher查询
        • 使用参数化查询
        • 使用更高效的查询模式
        • 监控和分析查询性能

 


Cypher 查询语言

Cypher 是 neo4j 查询语言。

以下列举一些最少必要知识,能用就行。

其他用法,可以问大模型。

创建数据

CREATE (n:User {name:"小明", age:18}) RETURN n
# 创建一个属性为 name:"小明" 和 age:18 的 User 类型的节点,并返回这个节点。CREATE (n:User {name:"小明"}) -[r:LOVE{time:"一万年"}]-> (m:User{name:"小红"}) return n,r,m
# 创建了两个用户节点:小明 和 小红。它还创建了一个从 小明 指向 小红 的 LOVE 类型的关系,并设置了属性 time:"一万年"。该命令返回这两个节点以及他们之间的关系。CREATE (n:User {name:"小明"}) <-[r:LOVE{time:"一万年"}]- (m:User{name:"小红"}) return n,r,m
# 与第二条命令类似,但关系的方向相反。

在 Cypher 查询语言中,用于图数据库操作的特定符号有特殊意义,这里对您提到的符号进行详细解释:

  1. {}(花括号):

    花括号用于定义节点或关系的属性。

    在创建节点或关系时,花括号内可以包含一系列的键值对,键与值之间用冒号分隔。例如:

    CREATE (n:User {name: "小明", age: 18})
    

    这里 {name: "小明", age: 18} 定义了一个 User 类型的节点,具有 nameage 两个属性。

  2. :(冒号):
    冒号在 Cypher 中用于指定节点的标签或关系的类型。

    标签通常用来分类或标识不同的节点,而关系的类型用来描述节点之间的连接方式。

    例如:

    MATCH (n:User) -[:FRIEND]-> (m:User)
    

    这里 :User 表明 nmUser 类型的节点,而 :FRIEND 指明两者之间的关系类型为 FRIEND

  3. ->(箭头):
    箭头用于指明关系的方向。

    在图数据库中,关系可以是有向的,箭头显示了从一个节点指向另一个节点的路径。例如:

    CREATE (n) -[:LIKES]-> (m)
    

    这表示从节点 n 到节点 m 存在一个 LIKES 类型的关系,并且方向是从 n 指向 m

  4. ()(圆括号):

    圆括号用于围绕节点,并可与其他符号结合表示关系和属性。

    在定义节点时,圆括号内可以包含节点的变量名(可选)、标签(可选)和属性(可选)。例如:

    MATCH (n) -[:KNOWS]-> (m)
    

    这里 (n)(m) 分别代表图中的两个节点,通过 KNOWS 关系相连。

这些符号的组合使得 Cypher 查询语言能够直观地描述和操作图数据结构。

查询数据

这三个 Cypher 查询示例都是用来从图数据库中检索数据的:

查询并返回所有节点
MATCH (n) 
RETURN n
  • MATCH (n): 匹配图中的所有节点,这里 n 是节点的变量名,可以用来引用任何被匹配到的节点。
  • RETURN n: 返回所有匹配到的节点。
  • 注释:// 匹配并返回图中的所有节点
查询并返回所有带有特定标签的节点
MATCH (n:User) 
RETURN n
  • MATCH (n:User): 匹配图中所有标记为 User 的节点,:User 指定了节点的标签。
  • RETURN n: 返回所有带有 User 标签的节点。
  • 注释:// 查询并返回所有标为“User”的节点
查询特定属性的节点及其所有关系和关系的另一端节点
MATCH (n:User {name:"小明"}) -[r]- (m) 
RETURN n, r, m
  • MATCH (n:User {name:"小明"}) -[r]- (m): 匹配图中名为 “小明” 的 User 类型节点,并匹配该节点的所有关系 r 及关系的另一端节点 m。关系 [r] 没有指定方向,表示可以是任何方向。
  • RETURN n, r, m: 返回与名为 “小明” 的 User 节点有关系的所有节点和这些关系。写成 return * 等同
  • 注释:// 查询名为“小明”的用户节点及其所有关系和关联节点
查询从名为“小明”的节点到名为“小红”的节点的路径
MATCH path = (a:User {name: "小明"})-[*]->(b:User {name: "小红"})
RETURN path

这条查询的解释如下:

  • MATCH path = (a:User {name: "小明"})-[*]->(b:User {name: "小红"}): 这里定义了一个变量 path 来保存从“小明”到“小红”的路径。(a:User {name: "小明"})(b:User {name: "小红"}) 分别指定了起点和终点节点,而 [*] 表示路径中可以包含任意数量和类型的关系,并且是有方向的,从“小明”指向“小红”。
  • RETURN path: 返回找到的所有路径。

如果你想限制路径的长度,例如,查找最多经过3个关系的路径,可以修改查询如下:

MATCH path = (a:User {name: "小明"})-[*..3]->(b:User {name: "小红"})
RETURN path

这个修改使得查询只返回最多包含三个关系的路径。

这样的限制有助于避免在大图中执行过于复杂的查询,从而可能导致性能问题。

此外,如果你对路径的详细信息感兴趣,比如路径中每个节点和关系的具体属性,你可以展开路径的返回内容:

MATCH path = (a:User {name: "小明"})-[*]->(b:User {name: "小红"})
RETURN nodes(path) AS nodes, relationships(path) AS relationships

这将返回路径中的所有节点和关系,使得你能够获取更多关于路径的具体细节。

这些查询覆盖了从最基本的节点检索到更具体的带有条件和关系的检索,适合不同的查询需求。

在实际使用时,根据图的大小和复杂性,你可能需要考虑查询的效率和性能。

更新数据

在 Cypher 查询语言中,更新数据通常涉及修改节点或关系的属性。这些操作通过 SET 关键词来实现。下面,我会给出一些常见的更新数据的示例:

更新一个节点的属性

假设你想更新名为“小明”的用户的年龄。你可以使用以下Cypher命令:

MATCH (n:User {name: "小明"})
SET n.age = 20
RETURN n

这条命令的解释如下:

  • MATCH (n:User {name: "小明"}): 找到所有名为“小明”的 User 节点。
  • SET n.age = 20: 将这些节点的 age 属性设置为 20
  • RETURN n: 返回更新后的节点。
添加新属性

如果你想给“小明”添加一个新的属性,比如 email

MATCH (n:User {name: "小明"})
SET n.email = "xiaoming@example.com"
RETURN n

这将给“小明”节点添加一个 email 属性,并设其值为 “xiaoming@example.com”。

更新关系的属性

假设你想更新“小明”和“小红”之间 LOVE 关系的时间属性:

MATCH (a:User {name: "小明"})-[r:LOVE]->(b:User {name: "小红"})
SET r.time = "两万年"
RETURN a, r, b

这条命令的解释如下:

  • MATCH (a:User {name: "小明"})-[r:LOVE]->(b:User {name: "小红"}): 找到从“小明”到“小红”的 LOVE 类型的关系。
  • SET r.time = "两万年": 更新这个关系的 time 属性。
  • RETURN a, r, b: 返回更新后的节点和关系。

删除数据

在 Cypher 查询语言中,删除操作涉及到移除节点、关系、属性或整个图结构的一部分。

删除节点

要删除特定的节点,你需要先匹配到这个节点,然后使用 DELETE 命令。

需要注意的是,如果该节点还有任何关系,直接删除会失败,因为图数据库要求任何存在的关系都必须有明确的起点和终点。

如果你想删除一个节点及其所有关系,可以使用 DETACH DELETE

示例:删除名为“小红”的用户节点及其所有关系:

MATCH (n:User {name: "小红"})
DETACH DELETE n

这里,DETACH DELETE n 会删除匹配到的节点 n 及其所有关系。

删除关系

如果你想单独删除节点之间的关系而保留节点本身,可以匹配到这些关系然后删除它们。

示例:删除“小明”和“小红”之间的所有关系:

MATCH (a:User {name: "小明"})-[r]-(b:User {name: "小红"})
DELETE r

这条命令不会删除任何节点,只会删除两个用户之间的所有关系。

删除属性

你可以使用 REMOVE 命令来删除节点或关系上的某个属性。

示例:删除“小明”节点的 age 属性:

MATCH (n:User {name: "小明"})
REMOVE n.age
RETURN n

执行后,“小明”的节点将不再有 age 属性。

三元组导入知识图谱

对于 kg_triples_small.txt
  1. 检查数据格式

    • 确认每行是不是标准的三元组形式,例如 "主体, 关系, 宾体"
  2. 导入到Neo4j

    • 如果文件已经是CSV格式,直接使用如下Cypher命令导入:
      LOAD CSV FROM 'file:///path_to_kg_triples_small.csv' AS line
      MERGE (subject:Entity {name: line[0]})
      MERGE (object:Entity {name: line[2]})
      MERGE (subject)-[r:RELATION {type: line[1]}]->(object)
      
对于 CPubMed-KGV_1.1.txt

CPubMed-KGV_1.1.txt 格式有点特别。

是@@形式,这种和三元祖形式有差异,要怎么处理呢?

这种数据是人工做的标识文本,是分类,特有的设计模式,直接导入就可以了。

可以用llamaindex,可以直接导入,因为AI帮你处理了数据,就不用你手动写代码转csv。

深度级联查询 - 获取全面的症状-疾病网络

在医学领域,构建和查询症状与疾病之间的网络可以极大地帮助医生和研究人员理解疾病的复杂关系,从而改进诊断和治疗方法。

在这样的应用场景中,深度级联查询可以用来探索症状和疾病之间的多级关联,比如通过中间状态或其他相关症状/疾病来链接起始症状和目标疾病。

首先,我们需要构建一个图模型,其中包含两种基本类型的节点:Symptom(症状)和Disease(疾病)。

这些节点通过关系如INDICATES(表征)、LEADS_TO(导致)或ASSOCIATED_WITH(相关联)相连。

例如:

  • 症状A INDICATES 疾病B
  • 疾病B LEADS_TO 疾病C
  • 症状A ASSOCIATED_WITH 症状D

假设我们想要探索某个特定症状如何通过一系列其他症状和疾病最终可能导致某个具体疾病。

这种查询不仅有助于诊断,还能揭示潜在的病理路径。

MATCH path = (s:Symptom {name: "Persistent Cough"})-[:INDICATES|ASSOCIATED_WITH*1..4]->(d:Disease {name: "Lung Cancer"})
RETURN path

这里的查询做了以下几点:

  • 起始节点:症状节点,名为“Persistent Cough”(持续性咳嗽)。
  • 目标节点:疾病节点,名为“Lung Cancer”(肺癌)。
  • 关系类型和深度:通过INDICATES(表征)或ASSOCIATED_WITH(相关联)关系,探索从起始症状到目标疾病的所有可能路径,路径的深度从1到4级不等。
  • 返回:返回从“持续性咳嗽”可能导致“肺癌”的所有路径。

为了进一步探索可能的中间疾病和症状,可以扩展查询来包含更多的关系类型和节点:

MATCH path = (s:Symptom {name: "Persistent Cough"})-[:INDICATES|ASSOCIATED_WITH|LEADS_TO*1..6]->(d:Disease {name: "Lung Cancer"})
RETURN path

在这个查询中,添加了LEADS_TO关系,这表示疾病到疾病的直接影响,允许探索更长的病理路径。

Python 交互 Neo4j

在项目中,一般是Python中执行Cypher查询语句,从而操作Neo4j数据库中的数据,而不是直接对着 neo4j 操作。

步骤 1: 安装 Neo4j Python 驱动程序

首先,确保你已经安装了neo4j包。如果还未安装,可以通过pip安装:

pip install neo4j
步骤 2: 建立连接

你需要创建一个与Neo4j数据库的连接。通常这涉及到指定数据库的URL、用户名和密码。

from neo4j import GraphDatabaseuri = "bolt://localhost:7687"  # Neo4j实例的Bolt URL
username = "neo4j"
password = "your_password"driver = GraphDatabase.driver(uri, auth=(username, password))
步骤 3: 执行查询

通过定义一个函数来执行查询。这个函数使用一个驱动实例来运行Cypher查询并返回结果。

def get_user(driver, name):with driver.session() as session:result = session.run("MATCH (u:User {name: $name}) RETURN u", name=name)return [record["u"] for record in result]# 调用函数
user_data = get_user(driver, "小明")
print(user_data)
步骤 4: 处理事务

为了处理更复杂的业务逻辑,可以在会话中执行多个操作作为一个事务。

def create_friendship(driver, name1, name2):with driver.session() as session:session.write_transaction(lambda tx: tx.run("MATCH (a:User), (b:User) ""WHERE a.name = $name1 AND b.name = $name2 ""CREATE (a)-[:FRIENDS_WITH]->(b)", name1=name1, name2=name2))create_friendship(driver, "小明", "小红")
步骤 5: 关闭驱动

操作完成后,确保关闭驱动连接。

driver.close()

查询性能优化

在医学问诊的场景中,使用Neo4j来存储和查询有关疾病、症状、治疗方法及其相互关系的数据时,可以采取以下优化策略来提升查询性能。每个策略下将给出一个具体的例子:

使用索引

应用场景:快速查找特定症状或疾病的记录。
示例:为疾病的名称创建索引,以便快速启动诊断过程。

CREATE INDEX ON :Disease(name)
合理使用标签

应用场景:确保查询只涉及相关类型的节点,以减少查询范围。
示例:在查询涉及特定类型的节点时,使用合适的标签。

MATCH (s:Symptom)-[:INDICATES]->(d:Disease)
WHERE s.name = 'Headache'
RETURN d.name

在此例中,SymptomDisease 标签帮助数据库引擎快速定位和查询相关节点。

优化Cypher查询

应用场景:避免返回不必要的数据,减少数据传输。
示例:只返回需要的属性,而不是整个节点。

MATCH (p:Patient)-[:HAS_SYMPTOM]->(s:Symptom)
RETURN s.name

这里,只返回症状名称而非整个症状节点的所有属性。

使用参数化查询

应用场景:提高查询的重用性和安全性。
示例:使用参数化的方式来查询具有特定症状的所有患者。

MATCH (p:Patient)-[:HAS_SYMPTOM]->(s:Symptom {name: $symptomName})
RETURN p.name

参数 $symptomName 可以在运行时提供,这样同一查询可以用于不同的症状。

使用更高效的查询模式

应用场景:避免过于复杂的匹配模式,特别是在大型图中。
示例:使用较短的路径和限制结果集的大小来优化查询。

MATCH path = (s:Symptom {name: 'Fever'})-[:INDICATES*1..2]->(d:Disease)
RETURN d.name LIMIT 10

这里,路径长度限制为1到2跳,查询结果也限制为最多10个。

监控和分析查询性能

应用场景:识别和优化慢查询。
示例:使用PROFILE来分析查询并找出性能瓶颈。

PROFILE MATCH (p:Patient)-[:HAS_DISEASE]->(d:Disease)
WHERE d.name = 'Diabetes'
RETURN p.name

PROFILE 提供了关于查询如何执行的详细信息,包括每个操作的数据库命中次数和资源消耗。

通过应用这些策略,医学问诊系统的数据库查询可以更加快速和有效,从而提升系统的整体性能和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫和用腾讯云API接口进行翻译并存入excel,通过本机的Windows任务计划程序定时运行Python脚本!

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a;定时爬取外网的某个页面&#xff0c;并将需要的部分翻译为中文存入excel 接下了的&#xff0c;没学过的最好看一下 基本爬虫的学习 【爬虫】requests 结合 BeautifulSoup抓取网页数据_requests beauti…

Vue CoreVideoPlayer 一款基于 vue.js 的轻量级、优秀的视频播放器组件

大家好,我是程序视点的小二哥!今天小二哥给大家推荐一款非常优秀的视频播放组件 效果欣赏 介绍 Vue-CoreVideoPlayer 一款基于vue.js的轻量级的视频播放器插件。 采用Adobd XD进行UI设计&#xff0c;支持移动端适配,不仅功能强大&#xff0c;颜值也是超一流&#xff01; Vue-…

第一次构建一个对话机器人流程解析(二)

1. 问答机器人的组成-基于知识图谱的搜索 在教育场景下&#xff0c;若学生有关于学习内容的提问&#xff0c;或业务层面的提问&#xff0c;则要求问答机器人的回答必须精准&#xff0c;来满足业务的要求因此需要通过知识图谱来快速检索&#xff0c;所提内容的相关信息&#xf…

数字系统与进制转换

数字系统 数字逻辑是计算机科学的基础&#xff0c;它研究的是如何通过逻辑门电路&#xff08;与门、或门、非门等&#xff09;实现各种逻辑功能。数字系统则是由数字逻辑电路组成的系统&#xff0c;可以实现各种复杂的运算和控制功能。在计算机科学中&#xff0c;数字逻辑和数…

自定义波形图View,LayoutInflater动态加载控件保存为本地图片

效果图: 页面布局: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="…

Kubernetes基于helm部署jenkins

Kubernetes基于helm安装jenkins jenkins支持war包、docker镜像、系统安装包、helm安装等。在Kubernetes上使用Helm安装Jenkins可以简化安装和管理Jenkins的过程。同时借助Kubernetes&#xff0c;jenkins可以实现工作节点的动态调用伸缩&#xff0c;更好的提高资源利用率。通过…

MySQL Innodb存储引擎中,当页默认的大小是16K时,页中最多存放多少行的记录?

1、题目引入 Innodb存储引擎是面向行的(row-oriented)&#xff0c;也就是说数据的存放按行进行&#xff0c;每页存放的行记录是有硬性定义的&#xff0c;当页默认的大小是16K时&#xff0c;页中最多存放多少行的记录&#xff1f; A、1600 行B、8192 行C、16383 行D、7992 行 …

基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现

随着旅游业的迅速发展&#xff0c;个性化旅游推荐系统成为提升用户体验和促进旅游市场增长的重要工具。本研究旨在设计并实现一种基于Python协同过滤的旅游景点推荐系统&#xff0c;结合Django框架、MySQL数据库存储、Bootstrap前端框架以及echarts数据可视化技术&#xff0c;为…

【粉丝福利 | 第8期】值得收藏!推荐10个好用的数据血缘工具

⛳️ 写在前面参与规则&#xff01;&#xff01;&#xff01; ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论三次&#xff09; ⛳️本次送书1~4本【取决于阅读量&#xff0c;阅读量越多&#xff0c;送的越多】 目前市面上绝…

数据迁移探索

概念 数据迁移是指将数据从一个计算环境或存储系统移动到另一个计算环境或存储系统。 随着公司业务的发展&#xff0c;出于成本优化、系统升级、分库分表、整合数据等原因。数据迁移工作在日常工作中会陆续出现。 我们可以将数据迁移分成两个部分&#xff0c;第一部分是数据…

springboot高职院校毕业生信息管理系统-计算机毕业设计源码27889

摘 要 基于Java语言开发的高职院校毕业生信息管理系统旨在提供一个便捷、高效的方式来管理毕业生的相关信息。系统包括学生基本信息管理、成绩管理、就业信息管理等模块&#xff0c;通过界面友好、操作简单的设计&#xff0c;方便管理员快速查询和更新学生信息。系统还提供数据…

采用前后端分离技术架构+java语言开发的全套产科信息管理系统源码 可与医院HIS、LIS、PACS、RIS等系统进行对接

采用前后端分离技术架构java语言开发的全套产科信息管理系统源码 可与医院HIS、LIS、PACS、RIS等系统进行对接 什么是产科信息管理系统-建档管理&#xff1f; 产科信息管理系统建档管理通过信息技术实现了孕产妇健康信息的电子化、网络化和智能化管理&#xff0c;提高了医疗服…

Riscv 架构的合规测试

为啥直接关注riscv-arch-test&#xff0c;是因为RISCOF 测试框架使用的是riscv-arch-test 1. The architectural test 架构测试是一个单一的测试&#xff0c;代表了可编译和运行的最小测试代码。它是用汇编代码编写的&#xff0c;其产品是test signature。一个架构测试可能由…

微信小程序推送消息java版

需求背景 使用springboot2微信小程序推送消息。百度了一下看了一篇文章整体还可以&#xff0c;这里推荐一下。 教程解析 1、微信平台开通订阅消息。 2、添加模板。 3、springboot后台接口开发 微信平台验证地址接口开发&#xff0c;然后部署到公网服务器。 4、微信平台验…

基于FPGA的数字信号处理(15)--定点数的舍入模式(6)向0取整fix

前言 在之前的文章介绍了定点数为什么需要舍入和几种常见的舍入模式。今天我们再来看看另外一种舍入模式&#xff1a;向上取整fix。 10进制数的fix fix&#xff1a;也叫 向0取整。它的舍入方式是数据往0的方向&#xff0c;舍入到最近的整数&#xff0c;比如1.75 fix到2&#xf…

将WordPress的文章重新排序的3个方法

有效的调整文章显示顺序看开可以更好突出内容&#xff0c;还可以保持网站的新鲜感&#xff0c;今天我将带您了解三种方法&#xff0c;通过重新排序文章显著提升网站的吸引力。我们将逐步讲解从调整设置到使用插件以及“置顶”文章的每一种方法&#xff0c;确保WordPress 新手也…

利用python进行数据分析 —— python正则表达式(持续更新中!)

文章目录 利用python进行数据分析 —— python基础知识进阶重点笔记&#xff1a;正则表达式re.match 匹配开头re.search 全文匹配re.sub 替换删除re.compile 编译正则findall 返回列表finditer 返回迭代器re.split 分割返回列表(?P...) 分组匹配正则表达符号、修饰符通配符1 ^…

谷歌上新!最强开源模型Gemma 2,27B媲美LLaMA3 70B,挑战3140亿Grok-1

文章目录 LMSYS Chatbot Arena&#xff1a;开源模型性能第一Gemma为什么这么强&#xff1f;架构创新对AI安全性的提升 A领域竞争激烈&#xff0c;GPT-4o 和 Claude 3.5 Sonnet 持续发力&#xff0c;谷歌迅速跟进。 谷歌为应对AI竞争所采取的策略&#xff1a;依靠 Gemini 闭源模…

hdu物联网硬件实验3 按键和中断

学院 班级 学号 姓名 日期 成绩 实验题目 按键和中断 实验目的 实现闪灯功能转换 硬件原理 无 关键代码及注释 /* Button Turns on and off a light emitting diode(LED) connected to digital pin 13, when pressing a pushbutton attached…

解决WSL2报错:当前电脑配置不支持WSL2,请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化

事情要追溯到突发奇想下载了腾讯的手游模拟器开始。。。因为一直闪退&#xff0c;模拟器自检就要求把虚拟化功能关闭了&#xff0c;结果还是一直闪退&#xff0c;WSL2也给我报错了。。。大无语 主要通过以下两个步骤解决&#xff0c;操作了之后需要把电脑重启&#xff1a; 一、…