【工具】图数据库Neo4j和py2neo库的使用

目录

图数据库Neo4j

py2neo库

图数据库Neo4j

图形数据库也被称为图形数据库管理系统(GDBMS),现发展比较成熟的图数据库有Neo4j、OracleNoSQL、OrientDB、HypherGraphDB和GraphBase等

其中Neo4j是基于Java语言编写的图形数据库,它采用节点和关系的形式存储信息,并在此基础上提供界面友好的可视化演示,Neo4j图形数据库的主要组成有:

  • 节点:即实体,用于表示一个单独存在的个体,节点一般包含多个属性
  • 关系:也就是“边”,两个节点靠关系才能连接,每个关系也具有它自己的名词,可以通过Cypher检索关系名称来查找具有该关系的所有节点
  • 属性:可以看作是节点的扩展描述,id、名称这些也属于节点的属性,详细的属性需要通过数据浏览器的Text标签进行查看
  • 标签:即分组,Neo4j在建立节点或关系时要求事先分组
  • 数据浏览器:Neo4j自己的可视化界面,用于提供用户执行Cypher查询命令并查看输出文本和图形

Neo4j采用声明式查询语言Cypher,常用的增删查改指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 删除以往的所有节点和关系,MATCH是匹配操作,()表示一个节点,n是标识符
MATCH (n) DETACH DELETE n

# 创建一个标签为Person的节点,节点有一个name属性,属性值为'John'
CREATE (n:Person{name:'John'}) RETURN n

# 从a到b建立起FRIENDS关系,关系有一个since属性,属性值为2001
MATCH (a:Person{name:'Liz'}),(b:Person{name:'Mike'})MERGE (a)-[:FRIENDS{since:2001}]->b

# 查询在Boston出生的所有Person
MATCH (a:Person)-[:BORN_IN]->(b:location{city:'Boston'}) RETURN a,b

# 查询所有具有对外关系的节点
MATCH (a)-->() RETURN a

# 查询所有具有关系的节点
MATH (a)--() RETURN a

# 查询所有具有对外关系的节点,并返回节点的name属性值和关系类型
MATCH (a)-[r]->() RETURN a.name, type(r)

# 给a节点设置一个age属性,属性值为34
MATCH (a:Person{name:'Liz'}) SET a.age = 34

# 删除a节点的test属性
MATCH ... REMOVE a.test

# 删除a节点
MATCH ... DELETE a

当数据量过大时,可以将数据转变成UTF-8编码格式的.csv文件批量导入Neo4j

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建节点语法
# 从import文件夹中读取genre.csv
# 创建标签为genre的节点,节点有两个属性genre_id、genre_name,属性值为genre.csv中的genre_id、genre_name
load csv with headers from "file:///genre.csv" as line create (a:genre{genre_id:line.genre_id, genre_name:line.genre_name})

# 创建关系语法
# 从import文件夹中读取actor_to_movie.csv
# 根据actor_to_movie.csv中的数据匹配a和m节点,并在它们之间建立ACTED_IN关系
load csv with headers from "file:///actor_to_movie.csv" as line match (a:Actor), (m:Movie) where a.actor_id = line[1] and m.movie_id = line[2] create (a)-[:ACTED_IN]->(m)

# PS:上述载入关系有时会因数据规模太大产生笛卡尔积而Neo4j不予通过,可改用以下形式分三次执行,结果一样
load csv with headers from "file:///actor_to_movie.csv" as line create (a:actor_to_movie{actor_id:line.actor_id, movie_id:line.movie_id})
match (a:actor), (m:movie), (n:actor_to_movie) where a.actor_id = n.actor_id and m.movie_id = n.movie_id create (a)-[:ACTED_IN]->(m)
match (n:actor_to_movie) delete n

py2neo库

py2neo库是Neo4j图数据库的python驱动
使用py2neo操作Neo4j有两种形式,一种是直接采用py2neo自己创建好的函数,另一种是采用Cypher语言

由于上文已经学习了Cypher语言的基本操作,本文在这里介绍第二种形式

1
2
3
4
5
6
7
8
9
10
11
# 导入py2neo库
form py2neo import Graph

# 配置链接到Neo4j的参数
graph = Graph('http://localhost:7474', usename='neo4j', password='123456')
# sql是符合Cypher语言的字符串,注意要return你需要的数据
sql = "match (n:rocket{roket_id:'1'} return n.rocket_name"
# 链接到Neo4j中执行Cypher语句,会返回一个字典类型
result = graph.run(sql).data()
# 从字典中抽取数据
deal_result = result['n.rocket_name']