KBQA知识图谱问答

KBQA知识图谱问答

  • 1.学习图数据库Neo4j
    • 1.1引言
    • 1.2创建节点
    • 1.3创建关系
    • 1.4查询
    • 1.5修改和删除
  • 2.医药知识图谱问答
  • 参考文献

1.学习图数据库Neo4j

1.1引言

知识图谱数据包含实体、属性、关系等,存储一般采用图数据库(Graph Databases),而Neo4j是其中最为常见的图数据库。官网下载对应系统的Neo4j。

cypher:是Neo4J的声明式图形查询语言,允许用户不必编写图形结构的遍历代码,就可以对图形数据进行高效的查询。

1.2创建节点

1.打开neo4j中一个库的browser,删除库中的数据

  MATCH (n) DETACH DELETE n

MATCH是匹配操作,而小括号()代表一个节点node(可理解为括号类似一个圆形),括号里面的n为标识符。
KBQA知识图谱问答_第1张图片
2.创建6个人物节点

  CREATE (n:Person {name:'John'}) RETURN n;
  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

CREATE是创建操作,Person是标签,代表节点的类型;花括号{}代表节点的属性,属性类似Python的字典;这条语句的含义就是创建一个标签为Person的节点,该节点具有一个name属性,属性值是John。
KBQA知识图谱问答_第2张图片
3.创建5个地区节点

  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。
KBQA知识图谱问答_第3张图片

1.3创建关系

1.同种类型创建关系

MATCH (a:Person{name:'Liz'}),(b:Person{name:'Mike'}) MERGE (a)-[:FRIENDS]->(b);
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);
MATCH (a:Person {name:'Shawn'}), (b:Person {name:'Sally'})   MERGE (a)-[:FRIENDS since:2001}]->(b)

方括号[]即为关系,FRIENDS为关系的类型;注意这里的箭头–>是有方向的,表示是从a到b的关系。 这样,Liz和Mike之间建立了FRIENDS关系;{}在关系[]中是给关系增加属性。
KBQA知识图谱问答_第4张图片
2.不同类型创建关系

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)

KBQA知识图谱问答_第5张图片
3.创建节点时就建立关系

  CREATE (a:Person {name:'Todd'})-[r:FRIENDS]->(b:Person {name:'Carlos'})

KBQA知识图谱问答_第6张图片

1.4查询

1.查询下所有在Boston出生的人物

  MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b

KBQA知识图谱问答_第7张图片
2. 查询所有有关系的节点

MATCH (a)--() RETURN a

KBQA知识图谱问答_第8张图片
3.查询所有对外有关系的节点(这里有箭头,表明了关系方向是向外)

MATCH (a)-->() RETURN a

KBQA知识图谱问答_第9张图片

4.查询所有对外有关系的节点,以及关系类型

  MATCH (a)-[r]->() RETURN a.name, type(r)

KBQA知识图谱问答_第10张图片
5.查询所有有结婚关系的节点

  MATCH (n)-[:MARRIED]-() RETURN n

KBQA知识图谱问答_第11张图片
6.查找某人的朋友的朋友

MATCH (a:Person {name:'Mike'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName

KBQA知识图谱问答_第12张图片

1.5修改和删除

1.增加/修改节点属性

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

SET表示修改操作
KBQA知识图谱问答_第13张图片
2.删除节点的属性

MATCH (a:Person {name:'Liz'}) REMOVE a.age

REMOVE表示删除节点属性操作
KBQA知识图谱问答_第14张图片
3.删除节点

MATCH (a:Location {city:'Portland'}) DELETE a

DELETE是删除节点操作
4.删除有关系的节点

MATCH (a:Person {name:'Todd'})-[rel]-(b:Person) DELETE a,b,rel

2.医药知识图谱问答

这里我用了刘焕勇老师github项目中的医药知识图谱自动问答系统进行学习。
1.搭建项目需要的python虚拟环境。

conda create -n kbqa python
conda activate kbqa
pip install lxml
pip install pymongdb
pip install py2neo#好像科学上网才能下载

安装mongdb,参考博文。
安装neo4j,参考博文。neo4j和java的版本要对应,不然运行neo4j console时会出现错误Run with ‘–verbose’ for a more detailed error message,这里可以参考博文和博文。这里我搞了好久,其实就两个问题,给环境变量里面path里面加入java的bin目录和neo4j的bin目录;这样就可以cmd中查看这两个的version,然后就是我运行neo4j console时出现了Please use Oracle® Java™ 17, OpenJDK™ 17 to run Neo4j,这句话的意思就是java要用17版本的,而不是别的版本的,这里注意看自己需要哪个版本,我因为只看博文换了好多版本,后来才明白看这个报错已经明确说了要17版。
还有就是一直报错
== main ERROR Cannot access RandomAccessFile java.io.FileNotFoundException: D:\Softwares\Neo4j\neo4j-community-5.2.0\logs\neo4j.log (拒绝访问。) ==这个拒绝访问就是权限不够,我把文件都放到了c盘的program files文件夹下了。
StatusLogger Unable to create file D:\Program Files\neo4j-community-4.4.0\logs\debug.log,说明该路径没有权限,修改该文件夹权限为可读写。
KBQA知识图谱问答_第15张图片

2.运行项目的data_spider.py,进行网页数据的爬取和解析。
报错:TypeError: ‘Collection’ object is not callable. If you meant to call the ‘insert’ method on a ‘Collection’ object it is failing because no such method exists。
原因:PyMongo 4.0.* 中 Collection.insert 方法被移除,使用 Collection.insert_one 或者 Collection.insert_many 替代。
解决:修改data_spider.py文件里的插入方法。

self.col.insert_one(data)
self.db['jc'].insert_one(data)

报错:localhost:27017: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
原因:因为程序里链接了mongodb数据库,而我却没有开mongodb的后台。
解决:后台启动mongodb,在mongodb的bin目录下打开cdm

mongod.exe  --dbpath D:\mongodb

3.运行build_medicalgraph.py文件,将data下的json文件导入到neo4j如数据库中。
报错:ValueError: The following settings are not supported
原因:Py2neo默认为最新版本,版本太高。
解决:图链接数据库时用新的语法。

self.g = Graph('http://localhost:7474/', auth=("neo4j", "123qwe"))

报错:py2neo.errors.ConnectionUnavailable: (‘Cannot open connection to %r’, ConnectionProfile(‘http://localhost:7474’))
原因:没有启动neo4j
解决

neo4j install-service
neo4j start

报错:‘gbk‘ codec can‘t decode byte 0xaf in position 81: illegal multibyte sequence
原因:文件的编码和解码的格式不一致
解决

for data in open(self.data_path,encoding='utf-8'):

成功运行neo4j和build_medicalgraph.py文件后就可以在html中看到数据库图。
KBQA知识图谱问答_第16张图片
4.运行chatbot_graph.py文件,进行人机交互。
首先配环境,还需要下载一些包

pip install pyahocorasick -i HTTPS://mirrors.aliyun.com/pypi/simple/

然后就可以成功运行查询疾病健康。
KBQA知识图谱问答_第17张图片

参考文献

【1】https://blog.csdn.net/weixin_44023658/article/details/112503294?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166964389816782425686367%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166964389816782425686367&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-112503294-null-null.142v67control,201v3add_ask,213v2t3_esquery_v2&utm_term=%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1&spm=1018.2226.3001.4187
【2】https://blog.csdn.net/zeroheitao/article/details/122925845
【3】

你可能感兴趣的:(job,知识图谱,neo4j,人工智能)