下载安装neo4j数据库。
neo4j本身是一个数据库,类似于mysql, oracle,mongoDb这种数据库,需要安装。
安装后需要修改一些配置文件:
然后到bin下运行neo4j console就可以启动起来了。
默认数据库是neo4j,数据存放在:
/安装目录/neo4j-community-4.2.1/data/databases/neo4j/下
图数据库的作用
参考如下这篇文章所讲,
https://www.jianshu.com/p/a2497a33390f
数据库的本质是为了方便查找不同的人或者事物之间的关系的,而不是为了存储数据的。
所以按这里的说法,正确的姿势是通过图数据库查找关系,找到目标数据后,然后再到mysql或者其他关系型数据库中获取该关系的其他属性数据。
比如,如果不用图数据库,那么查找数据,就得用for循环把整个知识库的规则都过一遍,可想而知,速度是极其慢的。
数据批量导入neo4j数据库
删除所有的关系
使用cql语句:
查询关系,如果不存在则创建
ga = node_matcher.match('genId', name=genId).first()
gb = node_matcher.match('genId', name=dupId).first()
rel_matcher = RelationshipMatcher(graph)
if rel_matcher.match({ga, gb}, 'duplicate').exists() == False:
ab = Relationship(ga, 'duplicate', gb, level=flag)
tx.create(ab)
直接merge
merge包含了match & create两步:
a = Node(‘genId’, name=genId)
b = Node(‘genId’, name=dupId)
ab = Relationship(a, ‘duplicate’, b, level=flag)
tx.merge(ab, ‘duplicate’, ‘name’)
插入节点和关系数据
目前最快的方式是通过neo4j自带的命令行工具neo4j-admin import来通过csv的方式插入节点和关系数据。
将数据插入为csv形式
entity.csv:
relationship.csv
注意:表头是有格式要求的,表头的字段都是名称:类型的格式,类型除了可以是int, bool, string这种,还有:ID, :LABEL, :TYPE也都是内置的格式,如果不加格式,默认是string。
另外节点的csv里必须要有:LABEL, 如果还有其他属性,可以在后面再添加。
关系的csv里必须先有:TYPE,然后在后边再加其他属性。
之前在关系csv里没有用:TYPE作为字段名称,出现报错。
导入
./neo4j-admin import --database neo4j --nodes ‘/home/xzh/jupyter/entity.csv’ --relationships ‘/home/xzh/jupyter/relationship.csv’
如果不想用默认的数据库,可以指定–database newname
然后启动server后,选择系统数据库,并create database newname
参考:
https://blog.csdn.net/mydoubts/article/details/114689720
但是目前只有企业版支持默认数据之外的数据库。社区版本只能使用默认的neo4j数据库。
如果要重新插入neo4j的数据库中,可以如下操作:
- ./neo4j stop
- 删除data/database/下的neo4j
- 删除data/transaction/下的neo4j
- ./neo4j-admin import xxx --database neo4j
- ./neo4j start
查询
使用py2neo可以直接在python里调用cypher查询语句。
以下是几个查询的例子:
- 查询某个药品能否用于特殊人群中的老人:
match_str = 'MATCH (n1:
药品
)-[r]-(n2:特殊人群
)
WHERE n1.genId = “6327” and n2.name=“老人” RETURN n1,n2,r ’
g = graph.run(match_str).to_data_frame()
这种写法是把条件放到了where里,也可以直接作为属性放到查询里:
match_str = ‘MATCH (n1:
药品
{genId:“6327”})-[r1]-(n2:特殊人群
{name: “老人”})
RETURN n1,n2,r1’
g = graph.run(match_str).to_data_frame()
- 组合查询,查询某个药品用于特殊人群中的老人时,如果老人的器官功能有问题是否会造成不合理用药。
match_str = ‘MATCH (n2:
特殊人群
)-[r1]-(n1:药品
)-[r2:脏器功能不佳者禁用
]-(n3:脏器
)
WHERE n1.genId=“6327” and n2.name=“老人” and r1.group=r2.group RETURN n1,n2,n3,r1,r2’
g = graph.run(match_str).to_data_frame()
这里有两组
(n2:
特殊人群
)-[r1]-(n1:药品
)
(n1:药品
)-[r2:脏器功能不佳者禁用
]-(n3:脏器
)
在neo4j的官方文档里有一个类似的例子:
MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = “Johan” AND surfer.hobby = “surfing”
RETURN DISTINCT surfer
其意是:johan想看看朋友的朋友中有没有喜欢冲浪的。