【知识图谱】(task3)知识图谱的存储和查询

news2024/11/27 14:45:14

note

  • 用图数据库的场景:
    • 高性能关系查询:需要快速遍历许多复杂关系的任何用例,如欺诈检测,社交网络分析,网络和数据库基础设施等;
    • 模型的灵活性:任何依赖于添加新数据而不会中断现有查询池的用例。模型灵活性包括链接元数据,版本控制数据和不断添加新关系。
    • 快速和复杂的分析规则:如子图的比较等这种需要执行复杂的规则时,在推荐、相似度计算和主数据管理等场景。
  • 原生图是指采用免索引邻接(Index-free adjacency)构建的图数据库引擎,如: AllegroGraph, Neo4j等。 可以通过py2neo实现用python操作neo4j;而如果使用neo4j模块:执行CQL ( cypher ) 语句,可以参考Introduction to Cypher。

文章目录

  • note
  • 一、基于关系型数据库的知识图谱存储
  • 二、基于原生图数据库的知识图谱
    • 2.1 原生图数据库:利用图的结构特征建索引
    • 2.2 Cypher图查询语言
      • (1)跨领域图建模与查询
      • (2)Cypher图查询举例
    • 2.3 常见的图数据库
  • 三、原生图数据库实现原理浅析
    • 3.1 实现原理:免索引邻接
    • 3.2 知识图谱存储的选择
    • 3.3 关于图模型和图数据库
  • 四、neo4j实践环节
    • 4.1 Schema 和引言
    • 4.2 创建节点
    • 4.3 创建关系
    • 4.4 创建 出生地关系
    • 4.5 图数据库查询
    • 4.6 删除和修改
  • 五、通过 Python 操作 Neo4j
    • 5.1 neo4j模块:执行CQL ( cypher ) 语句
    • 5.2 py2neo模块:通过操作python变量,达到操作neo4j的目的
  • 六、通过csv文件批量导入图数据
  • 时间安排
  • Reference

一、基于关系型数据库的知识图谱存储

在这里插入图片描述
关系型数据库的局限性:

  • 关系模型不善于处理“关系”:如要找到Bob用户的朋友可以很方便的通过关系数据库用户id表和朋友表进行join,但是要找到谁是Bob的朋友则需要遍历表所有行。
  • 处理关联查询:如要查询多跳关系,用关系数据库的效率很慢。
  • 知识图谱需要更加丰富的关系语义表达与关联推理能力
    • 在需要更加深入的研究数据之间的关系时,需要更加丰富的关系语义的表达能力, 除了前述Reflesive和多跳关系、还包括传递关系Transitive、对称关系(非对 称关系)Symmetric、反关系(Inverse)、函数关系(Functional)。
    • 除了关联查询能力,深层次的关系建模还将提供关联推理的能力,属性图数据库 如Neo4J提供了由于关系模型的关联查询能力,AllegroGraph等RDF图数据库提供 了更多的关联推理能力。
  • NoSQL也不是善于处理关联关系

在这里插入图片描述

上表截图自《知识图谱数据管理研究综述》王鑫

二、基于原生图数据库的知识图谱

2.1 原生图数据库:利用图的结构特征建索引

在这里插入图片描述

2.2 Cypher图查询语言

在这里插入图片描述

(1)跨领域图建模与查询

  • 查询语句能表示跨多个领域的关联逻辑

(2)Cypher图查询举例

在这里插入图片描述

2.3 常见的图数据库

在这里插入图片描述
在常用的neo4j图数据库中还有封装好的图算法:
在这里插入图片描述

三、原生图数据库实现原理浅析

3.1 实现原理:免索引邻接

  • 原生图是指采用免索引邻接(Index-free adjacency)构建的图数据库引擎,如: AllegroGraph, Neo4j等。
  • 采用免索引邻接的数据库为每一个节点维护了一组指向其相邻节点的引用,这组引用本质上可 以看做是相邻节点的微索引(Micro Index)。
  • 这种微索引比起全局索引在处理图遍历查询时非常廉价,其查询复杂度与数据集整体大小无关, 仅正比于相邻子图的大小。

在这里插入图片描述

3.2 知识图谱存储的选择

  • 知识图谱存储方式的选择需要综合考虑性能、动态扩展、实施成本等多方 面综合因素。
  • 区分原生图存储和非原生图存储:原生图存储在复杂关联查询和图计算方 面有性能优势,非原生图存储兼容已有工具集通常学习和协调成本会低。
  • 区分RDF图存储和属性图存储:RDF存储一般支持推理,属性图存储通常具 有更好的图分析性能优势。在大规模处理情况下,需要考虑与底层大数据存储引擎和上层图计算引擎 集成需求。

3.3 关于图模型和图数据库

  • 图模型是更加接近于人脑认知和自然语言的数据模型,图数据库是处理复杂的、 半结构化、多维度的、紧密关联数据的最好技术。
  • 图数据库的弱处:假如你的应用场景不包含大量的关联查询,对于简单查询, 传统关系模型和NoSQL数据库目前在性能方面更加有优势。
  • RDF作为一种知识图谱表示框架的参考标准,向上对接OWL等更丰富的语义表示 和推理能力,向下对接简化后的属性图模型以及图计算引擎,是最值得重视的知识图谱表示框架。

四、neo4j实践环节

4.1 Schema 和引言

  • 知识图谱另外一个很重要的概念是 Schema:
    • 介绍:限定待加入知识图谱数据的格式;相当于某个领域内的数据模型,包含了该领域内有意义的概念类型以及这些类型的属性
    • 作用:规范结构化数据的表达,一条数据必须满足Schema预先定义好的实体对象及其类型,才被允许更新到知识图谱中, 一图胜千言
      • 图中的DataType限定了知识图谱节点值的类型为文本、日期、数字(浮点型与整型)
      • 图中的Thing限定了节点的类型及其属性(即图1-1中的边)
    • 举例说明:基于下图Schema构建的知识图谱中仅可含作品、地方组织、人物;其中作品的属性为电影与音乐、地方组织的属性为当地的商业(eg:饭店、俱乐部等)、人物的属性为歌手

Schema定义.PNG

下面案例的节点主要包括人物和城市两类,人物和人物之间有朋友、夫妻等关系,人物和城市之间有出生地的关系。参考:异尘手把手教你快速入门知识图谱 - Neo4J教程

  • Person-Friends-PERSON
  • Person-Married-PERSON
  • Person-Born_in-Location

4.2 创建节点

  1. 删除数据库中以往的图,确保一个空白的环境进行操作【注:慎用,如果库内有重要信息的话】:
-- Neo4J 删库操作
  MATCH (n) DETACH DELETE n

这里,MATCH是匹配操作,而小括号()代表一个节点node(可理解为括号类似一个圆形),括号里面的n为标识符。

  1. 创建一个人物节点:
  CREATE (n:Person {name:'John'}) RETURN n

注:
CREATE是创建操作,Person是标签,代表节点的类型。
花括号{}代表节点的属性,属性类似Python的字典。
这条语句的含义就是创建一个标签为Person的节点,该节点具有一个name属性,属性值是John。

  1. 创建更多的人物节点,并分别命名:
  CREATE (n:Person {name:'Sally'}) RETURN n
  CREATE (n:Person {name:'Steve'}) RETURN n
  CREATE (n:Person {name:'Mike'}) RETURN n
  CREATE (n:Person {name:'Liz'}) RETURN n
  CREATE (n:Person {name:'Shawn'}) RETURN n

6个人物节点创建成功
image

  1. 创建地区节点
  CREATE (n:Location {city:'Miami', state:'FL'})
  CREATE (n:Location {city:'Boston', state:'MA'})
  CREATE (n:Location {city:'Lynn', state:'MA'})
  CREATE (n:Location {city:'Portland', state:'ME'})
  CREATE (n:Location {city:'San Francisco', state:'CA'})

节点类型为Location,属性包括city和state。

4.3 创建关系

  1. 朋友关系
  MATCH (a:Person {name:'Liz'}), 
        (b:Person {name:'Mike'}) 
  MERGE (a)-[:FRIENDS]->(b)

注意:方括号[]即为关系,FRIENDS为关系的类型。注意这里的箭头–>是有方向的,表示是从a到b的关系。 这样,Liz和Mike之间建立了FRIENDS关系。

  1. 关系增加属性
  MATCH (a:Person {name:'Shawn'}), 
        (b:Person {name:'Sally'}) 
  MERGE (a)-[:FRIENDS {since:2001}]->(b)

在这里插入图片描述

  1. 增加更多的朋友关系:
  MATCH (a:Person {name:'Shawn'}), (b:Person {name:'John'}) MERGE (a)-[:FRIENDS {since:2012}]->(b)
  MATCH (a:Person {name:'Mike'}), (b:Person {name:'Shawn'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
  MATCH (a:Person {name:'Sally'}), (b:Person {name:'Steve'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
  MATCH (a:Person {name:'Liz'}), (b:Person {name:'John'}) MERGE (a)-[:MARRIED {since:1998}]->(b)

图谱就已经建立好了:
在这里插入图片描述

4.4 创建 出生地关系

  1. 建立不同类型节点之间的关系-人物和地点的关系
  MATCH (a:Person {name:'John'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1978}]->(b)
  MATCH (a:Person {name:'Liz'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1981}]->(b)
  MATCH (a:Person {name:'Mike'}), (b:Location {city:'San Francisco'}) MERGE (a)-[:BORN_IN {year:1960}]->(b)
  MATCH (a:Person {name:'Shawn'}), (b:Location {city:'Miami'}) MERGE (a)-[:BORN_IN {year:1960}]->(b)
  MATCH (a:Person {name:'Steve'}), (b:Location {city:'Lynn'}) MERGE (a)-[:BORN_IN {year:1970}]->(b)

这里的关系是BORN_IN,表示出生地,同样有一个属性,表示出生年份。在人物节点和地区节点之间,人物出生地关系已建立好。

  1. 创建节点的时候就建好关系
  CREATE (a:Person {name:'Todd'})-[r:FRIENDS]->(b:Person {name:'Carlos'})

最终该图谱如下图所示:

在这里插入图片描述

4.5 图数据库查询

-- 查询下所有在Boston出生的人物
  MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b
-- 查询所有对外有关系的节点
  MATCH (a)--() RETURN a
-- 查询所有有关系的节点
  MATCH (a)-[r]->() RETURN a.name, type(r)
-- 查询所有对外有关系的节点,以及关系类型
  MATCH (a)-[r]->() RETURN a.name, type(r)
-- 查询所有有结婚关系的节点
  MATCH (n)-[:MARRIED]-() RETURN n
-- 查找某人的朋友的朋友(返回Mike的朋友的朋友)
  MATCH (a:Person {name:'Mike'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName

4.6 删除和修改

-- 增加/修改节点的属性
  MATCH (a:Person {name:'Liz'}) SET a.age=34
  MATCH (a:Person {name:'Shawn'}) SET a.age=32
  MATCH (a:Person {name:'John'}) SET a.age=44
  MATCH (a:Person {name:'Mike'}) SET a.age=25
 
-- 删除节点的属性
  MATCH (a:Person {name:'Mike'}) SET a.test='test'
  MATCH (a:Person {name:'Mike'}) REMOVE a.test

-- 删除节点操作是DELETE
  MATCH (a:Location {city:'Portland'}) DELETE a

-- 删除有关系的节点
  MATCH (a:Person {name:'Todd'})-[rel]-(b:Person) DELETE a,b,rel

五、通过 Python 操作 Neo4j

5.1 neo4j模块:执行CQL ( cypher ) 语句

  # step 1:导入 Neo4j 驱动包
  from neo4j import GraphDatabase
  # step 2:连接 Neo4j 图数据库
  driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
  # 添加 关系 函数
  def add_friend(tx, name, friend_name):
      tx.run("MERGE (a:Person {name: $name}) "
            "MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
            name=name, friend_name=friend_name)
  # 定义 关系函数
  def print_friends(tx, name):
      for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
                          "RETURN friend.name ORDER BY friend.name", name=name):
          print(record["friend.name"])
  # step 3:运行
  with driver.session() as session:
      session.write_transaction(add_friend, "Arthur", "Guinevere")
      session.write_transaction(add_friend, "Arthur", "Lancelot")
      session.write_transaction(add_friend, "Arthur", "Merlin")
      session.read_transaction(print_friends, "Arthur")

上述程序的核心部分,抽象一下就是:

  neo4j.GraphDatabase.driver(xxxx).session().write_transaction(函数(含tx.run(CQL语句)))

或者

  neo4j.GraphDatabase.driver(xxxx).session().begin_transaction.run(CQL语句)

5.2 py2neo模块:通过操作python变量,达到操作neo4j的目的

  # step 1:导包
  from py2neo import Graph, Node, Relationship
  # step 2:构建图
  g = Graph()
  # step 3:创建节点
  tx = g.begin()
  a = Node("Person", name="Alice")
  tx.create(a)
  b = Node("Person", name="Bob")
  # step 4:创建边
  ab = Relationship(a, "KNOWS", b)
  # step 5:运行
  tx.create(ab)
  tx.commit()

六、通过csv文件批量导入图数据

前面学习的是单个创建节点,不适合大批量导入。这里介绍使用neo4j-admin import命令导入,适合部署在docker环境下的neo4j。其他导入方法也可以参考Neo4j之导入数据。csv分为两个nodes.csv和relations.csv,注意关系里的起始节点必须是在nodes.csv里能找到的:

  # nodes.csv需要指定唯一ID和nam,
  headers = [
  'unique_id:ID', # 图数据库中节点存储的唯一标识
  'name', # 节点展示的名称
  'node_type:LABEL', # 节点的类型,比如Person和Location
  'property' # 节点的其他属性
  ]
  # relations.csv
  headers = [
  'unique_id', # 图数据库中关系存储的唯一标识
  'begin_node_id:START_ID', # begin_node和end_node的值来自于nodes.csv中节点
  'end_node_id:END_ID',
  'begin_node_name',
  'end_node_name',
  'begin_node_type',
  'end_node_type',
  'relation_type:TYPE', # 关系的类型,比如Friends和Married
  'property' # 关系的其他属性
  ]

制作出两个csv后,通过以下步骤导入neo4j:

  1. 两个文件nodes.csv ,relas.csv放在
  neo4j安装绝对路径/import
  1. 导入到图数据库mygraph.db
  neo4j bin/neo4j-admin import --nodes=/var/lib/neo4j/import/nodes.csv --relationships=/var/lib/neo4j/import/relas.csv   --delimiter=^ --database=xinfang*.db

delimiter=^ 指的是csv的分隔符

  1. 指定neo4j使用哪个数据库
  修改 /root/neo4j/conf/neo4j.conf 文件中的 dbms.default_database=mygraph.db
  1. 重启neo4j就可以看到数据已经导入成功了

时间安排

任务任务信息截止时间
-12月12日正式开始
Task01:CP1知识图谱概论(2天)12月12-13日 周二
Task02:CP2知识图谱表示 + CP3知识图谱的存储和查询(上)(6天)12月14-19日 周六
Task03:CP3知识图谱的存储和查询(下)(3天)12月20-22日 周二
Task04:CP4知识图谱的抽取和构建(3天)12月23-25日 周五
Task05:CP5知识图谱推理(4天)12月26-29日 周二

Reference

[1] 推荐系统前沿与实践. 李东胜等
[2] 自然语言处理cs224n-2021–Lecture15: 知识图谱
[3] 东南大学《知识图谱》研究生课程课件
[4] 2022年中国知识图谱行业研究报告
[5] 浙江大学慕课:知识图谱导论.陈华钧老师
[6] https://conceptnet.io/
[7] KG paper:https://github.com/km1994/nlp_paper_study_kg
[8] 北大gStore - a graph based RDF triple store
[9] Natural Language Processing Demystified
[10] 玩转Neo4j知识图谱和图数据挖掘
[11] 锋哥的NLP知识图谱学习笔记
[12] https://github.com/datawhalechina/team-learning-nlp/tree/master/KnowledgeGraph_Basic
[13] neo4j官方文档
[14] 干货 | 从零到一学习知识图谱的技术与应用
[15] 手把手教你快速入门知识图谱 - Neo4J教程
[16] python操作图数据库neo4j的两种方式
[17] Neo4j之导入数据
[18] schema 介绍
[19] 知识图谱Schema
[20] 美团大脑:知识图谱的建模方法及其应用
[21] 肖仰华. 知识图谱:概念与技术.北京:电子工业出版社, 2020.2-39.
[22] 图数据库neo4j的编程语句(详解)
[23] 医疗知识图谱问答系统:https://github.com/zhihao-chen/QASystemOnMedicalGraph
[24] 新一代知识图谱关键技术综述. 东南大学 王萌
[25] neo4j官方文档:https://neo4j.com/docs/getting-started/current/
[26] Introduction to Cypher

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

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

相关文章

Linux Kernel 6.0 CXL Core Regs.c 详解

前言 CXL 是一个比较新的技术,所以我研究的内核源码是选了当前比较新的内核版本 linux 6.0。打算将内核关于 CXL 的驱动进行解析一遍,一步一步慢慢来。 在阅读之前,希望读者能有一定的 PCIe 基础知识,精力有限,不能把…

C++ 不知算法系列之聊聊希尔、归并排序算法中的分治哲学

1. 前言 排序算法中,冒泡、插入、选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置。 希尔、归并、快速排序算法也可归为同一类,它们的共同点都是建立在分治思想之上。把…

Linux基本工具——gcc/g++与make/Makefile

Linux编译器,项目构成工具gcc/g程序翻译过程选项的含义动态链接静态链接如何识别静态链接和动态链接Linux项目自动化构建工具——make/Makefilemake/Makefile是什么make/Makefile的使用伪目标make/makefile推导过程gcc/g 程序翻译过程 预处理(去掉注释…

当了10年程序员,我开窍了

有人说,程序员的高收入和工作年限成正比,认为自己的薪资应该如此计算: private static boolean 计算工资() { //years工作时长(年) int years 5; while(years-- > 0){ 做项目(); 团建活动(); 涨工资(); 拿年终奖(); } return 跳槽() &…

12、后渗透测试--meterpreter使用

Post后渗透模块&#xff1a;在meterpreter > 中我们可以使用以下的命令来实现对目标的操作。一、基本系统命令 sessions # sessions –h 查看帮助sessions -i <ID值> # 进入会话 -k 杀死会话background # 将当前会话放置后台info # 查看已有模块信息getuid …

CSS之段落样式

1、文本缩进 标签&#xff1a;text-indent &#xff08;indent v. 缩进&#xff09;含义&#xff1a;首行缩进和字体大小有关&#xff1a;1个em等于一个字体大小 2、文本对齐方式 标签&#xff1a;text-align (align v. 调整&#xff0c;使一致)种类&#xff1a;左对齐、右对…

AFDet: Anchor Free One Stage 3D Object Detection

论文链接&#xff1a;https://arxiv.org/pdf/2006.12671v1.pdf 前言 在嵌入式系统上操作的高效点云3D目标检测对于包括自动驾驶在内的许多机器人应用来说都是重要的。 大多数以前的工作都试图使用基于Anchor的检测方法来解决这个问题&#xff0c;这些方法有2个缺点&#xff1…

《MySQL的基础语法》

【一】现实当前的数据库 show databases:记住这里的databases是复数形式&#xff0c;你可以简单理解为它不仅仅含有一个数据库&#xff0c;所以需要用到可数名词复数形式。 【二】创建数据库 create database 数据库的名字&#xff1a;记住这里的database用的是单数形式&#…

Django demo项目搭建

安装 Django 在应用程序开发中&#xff0c;分别创建env文件夹和wordspace文件夹。 env文件夹用于存放创建的虚拟环境&#xff0c;wordspace用于存放项目代码&#xff0c;至此实现虚拟环境和应用程序代码的分隔。 步骤1&#xff1a;创建文件夹&#xff0c;创建命令为mkdir en…

静态链接:空间与地址分配

前言 我们终于走到了链接这一步&#xff0c;对于链接这一步&#xff0c;它是将多个输入目标文件链接后输出一个可执行文件。我们拿两个程序a.c和b.c来举例说明链接的过程。 a.c&#xff1a; /* a.c */ extern int shared;int main(){int a 100;swap(&a,&shared); }…

从Mybatis到Mybatis-Plus学习

从Mybatis到Mybatis-PlusMybatis的入门Mybatis的配置解析核心配置文件分页配置注解开发mybatis的执行流程多对一一对多动态SQLmybatis 的缓存Mybatis-plus快速入门mybatis-plus的框架结构图分页查询和删除执行SQL分析打印条件构造器Wrapper代码生成器Mybatis的入门 环境&#…

io复用函数的使用

目录 一、概念 二、使用 1.select系统调用 代码实现 前言&#xff1a; 一般多客户端在和服务器通信时&#xff0c;服务器在执行recv时会先阻塞&#xff0c;然后按照顺序依次处理客户端&#xff0c;无论客户端有无数据都会被处理&#xff0c;这样大大降低了执行效率。此时就引…

代理 模式

代理模式 Proxy Pattern 为其他对象提供一个代理以控制对这个对象的访问 可以详细控制访问某个&#xff08;某类&#xff09;对象的方法&#xff0c;在调用这个方法前做前置处理&#xff0c;调用这个方法后做后置处理。 静态代理 直接写死的代码的代理逻辑 动态代理 动态…

12.2、后渗透测试--令牌窃取

攻击机kali&#xff1a;192.168.11.106靶机windows server 2008 R2&#xff1a;192.168.11.134&#xff08;包含ms17_010漏洞&#xff09;一、令牌简介与原理 令牌(Token) 就是系统的临时密钥&#xff0c;相当于账户名和密码&#xff0c;用来决定是否允许这次请求和判断这次请求…

二进制搭建k8s——部署node节点

上篇&#xff1a;二进制搭建k8s——部署etcd集群和单master 二进制搭建k8s——部署node节点二进制搭建k8s——部署node节点环境部署node节点部署网络组件方法一&#xff1a;部署Flannel方法二&#xff1a;部署 CalicoCNI网络插件介绍Kubernetes的三种网络K8S 中 Pod 网络通信&a…

浅浅讲解下Linux内存管理之CMA

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 Contiguous Memory Allocator, CMA&#xff0c;连续内存分配器&#xff0c;用于分配连续的大块内存。CMA…

c语言内存和文件处理有关知识

内存 分配内存的函数calloc&#xff0c;malloc 定义于头文件 <stdlib.h>功能malloc分配内存(函数)calloc分配并清零内存(函数)realloc扩充之前分配的内存块(函数)free归还还之前分配的内存(函数)aligned_alloc(C11)分配对齐的内存(函数) 函数原型 void *malloc(unsigne…

Java基础之Collection的ArrayList

Java基础之Collection的ArrayList一、add()与addAll()二、remove()三、trimToSize()1、案例一、add()与addAll() 跟C 的vector不同&#xff0c;ArrayList没有push_back()方法&#xff0c;对应的方法是add(E e)&#xff0c;ArrayList也没有insert()方法&#xff0c;对应的方法是…

Oracle---初学篇

Oracle初学篇 Oracle的启动&#xff0c;监听&#xff0c;用户 文章目录Oracle初学篇Oracle的启动Oracle的监听监听服务的主要文件1.listener.ora2.tnsnames.ora3.sqlnet.oraOracle用户Oracle安装成功后默认的三个用户创建用户Oracle的启动 之前写了关于如何在CentOS7上搭建Ora…

2021年全国研究生数学建模竞赛华为杯D题抗乳腺癌候选药物的优化建模求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 D题 抗乳腺癌候选药物的优化建模 原题再现&#xff1a; 一、背景介绍   乳腺癌是目前世界上最常见&#xff0c;致死率较高的癌症之一。乳腺癌的发展与雌激素受体密切相关&#xff0c;有研究发现&#xff0c;雌激素受体α亚型&#xff0…