目录
图数据库Neo4j
Cypher查询
py2neo查询
neo4j查询
图数据库Neo4j
图形数据库也被称为图形数据库管理系统(GDBMS),现发展比较成熟的图数据库有Neo4j、OracleNoSQL、OrientDB、HypherGraphDB和GraphBase等
其中Neo4j是基于Java语言编写的图形数据库,它采用节点和关系的形式存储信息,并在此基础上提供界面友好的可视化演示,Neo4j图形数据库的主要组成有:
- 节点:即实体,用于表示一个单独存在的个体,节点一般包含多个属性
- 关系:也就是“边”,两个节点靠关系才能连接,每个关系也具有它自己的名词,可以通过Cypher检索关系名称来查找具有该关系的所有节点
- 属性:可以看作是节点的扩展描述,id、名称这些也属于节点的属性,详细的属性需要通过数据浏览器的Text标签进行查看
- 标签:即分组,Neo4j在建立节点或关系时要求事先分组
- 数据浏览器:Neo4j自己的可视化界面,用于提供用户执行Cypher查询命令并查看输出文本和图形
Cypher查询
Neo4j采用声明式查询语言Cypher,常用的增删查改指令,详情见官方文档
# 删除以往的所有节点和关系,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
# 创建节点语法
# 从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语言描述形式
# 导入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']
neo4j查询
neo4j库是Neo4j图数据库的官方python驱动,可以参考官方文档.
from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
def add_friend(tx, name, friend_name):
tx.run("MERGE (a:Person {name: $name}) "
"MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
name=name, friend_name=friend_name)
def print_friends(tx, name):
for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
"RETURN friend.name ORDER BY friend.name", name=name):
print(record["friend.name"])
with driver.session() as session:
session.write_transaction(add_friend, "Arthur", "Guinevere")
session.write_transaction(add_friend, "Arthur", "Lancelot")
session.write_transaction(add_friend, "Arthur", "Merlin")
session.read_transaction(print_friends, "Arthur")