知识图谱数据包含实体、属性、关系等,存储一般采用图数据库(Graph Databases),而Neo4j是其中最为常见的图数据库。官网下载对应系统的Neo4j。
cypher:是Neo4J的声明式图形查询语言,允许用户不必编写图形结构的遍历代码,就可以对图形数据进行高效的查询。
1.打开neo4j中一个库的browser,删除库中的数据
MATCH (n) DETACH DELETE n
MATCH是匹配操作,而小括号()代表一个节点node(可理解为括号类似一个圆形),括号里面的n为标识符。
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。
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'})
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关系;{}在关系[]中是给关系增加属性。
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)
CREATE (a:Person {name:'Todd'})-[r:FRIENDS]->(b:Person {name:'Carlos'})
1.查询下所有在Boston出生的人物
MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b
MATCH (a)--() RETURN a
3.查询所有对外有关系的节点(这里有箭头,表明了关系方向是向外)
MATCH (a)-->() RETURN a
4.查询所有对外有关系的节点,以及关系类型
MATCH (a)-[r]->() RETURN a.name, type(r)
MATCH (n)-[:MARRIED]-() RETURN n
MATCH (a:Person {name:'Mike'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName
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
MATCH (a:Person {name:'Liz'}) REMOVE a.age
MATCH (a:Location {city:'Portland'}) DELETE a
DELETE是删除节点操作
4.删除有关系的节点
MATCH (a:Person {name:'Todd'})-[rel]-(b:Person) DELETE a,b,rel
这里我用了刘焕勇老师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,说明该路径没有权限,修改该文件夹权限为可读写。
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中看到数据库图。
4.运行chatbot_graph.py文件,进行人机交互。
首先配环境,还需要下载一些包
pip install pyahocorasick -i HTTPS://mirrors.aliyun.com/pypi/simple/
【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】