neo4j从安装到使用

下载安装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的数据库中,可以如下操作:

  1. ./neo4j stop
  2. 删除data/database/下的neo4j
  3. 删除data/transaction/下的neo4j
  4. ./neo4j-admin import xxx --database neo4j
  5. ./neo4j start

查询

使用py2neo可以直接在python里调用cypher查询语句。
以下是几个查询的例子:

  1. 查询某个药品能否用于特殊人群中的老人:

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()

  1. 组合查询,查询某个药品用于特殊人群中的老人时,如果老人的器官功能有问题是否会造成不合理用药。

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想看看朋友的朋友中有没有喜欢冲浪的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值