图数据库(一):Neo4j简介

目录

图数据库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")
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值