Neo4j 使用教程

[TOC]

一、介绍

相关链接

基础知识

  • 目前最流行的高性能的NoSQL图形数据库,结构化数据存储在网络上而不是在表中,完全由java开发
  • 支持完整的事务,在属性图中,图是由顶点(Vertex),边(Edge)和属性(Property)组成的,顶点和边都可以设置属性,顶点也称作节点,边也称作关系,每个节点和关系都可以由一个或多个属性。
  • Neo4j创建的图是用顶点和边构建一个有向图,其查询语言cypher已经成为事实上的标准。

二、安装

链接

命令

1
2
3
4
5
6
7
8
tar -xf neo4j-community-3.5.13-unix.tar.gz

cd neo4j-community-3.5.13/
## 取消54行注释
dbms.connectors.default_listen_address=0.0.0.0

./bin/neo4j console # 以控制台应用运行
./bin/neo4j start # 以后台进程运行

浏览器

三、Python操作

学习链接

创建代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from py2neo import Node, Relationship, Graph, NodeMatcher, RelationshipMatcher

# 新建图形
graph = Graph('http://localhost:7474', username='neo4j', password='neo4j.')

# 新建node
a = Node('label', name = 'a' )
b = Node('label', name = 'b' )

# 在graph中绘制node
graph.create(a)
graph.create(b)

# 新建关系并绘制
r1 = Relationship(a, 'to', b, name = 'to') #可以增加一些属性,也可以省略
graph.create(r1)

相关术语

图 Graph

  • graph = Graph(url,图数据库username=’name’,password=’pw’)

节点 Node

  • 构成一张图的基本元素是节点和关系。
  • 在Neo4j中,节点和关系都可以包含属性。
  • class Node(labels, *properties)

关系 Relationship

  • 节点之间的关系是图数据库很重要的一部分。
  • 一个关系连接两个节点,必须有一个开始节点和结束节点。
  • class Relationship(start_node, type, end_node, **properties)

属性

  • 节点和关系都可以设置自己的属性。
  • 属性是由Key-Value键值对组成,键名是字符串。
  • 属性值是要么是原始值,要么是原始值类型的一个数组。

查询代码

  • 后续补充…

四、数据导入

链接

方法

数据样例:./zzk/person.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
一灯大师 技能/武功 一阳指
一灯大师 传功 王重阳
王重阳 师弟 周伯通
周伯通 别名 老顽童
周伯通 义弟 郭靖
郭靖 义弟 杨康
杨康 儿子 杨过
杨过 妻子 小龙女
杨过 师傅 小龙女
小龙女 后人 黄衫女子
黄衫女子 惩戒 周芷若
郭靖 女儿 郭襄
郭襄 创立 峨嵋派
周芷若 因爱生恨 张无忌
张君宝 创立 武当派
张无忌 太师父 张君宝

处理数据:./zzk/do_data.py

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
def read_write(txt_file, node_file, edge_file):
node_dict = {}
with open(txt_file, "r", encoding="utf-8") as ft:
for line in ft:
row = line.rstrip().split()
if row[0] not in node_dict:
node_dict[row[0]] = len(node_dict)
if row[2] not in node_dict:
node_dict[row[2]] = len(node_dict)

with open(node_file, "w", encoding="utf-8") as fn:
fn.write("entity:ID,name,:LABEL" + "\n")
for node in node_dict:
fn.write("e" + str(node_dict[node]) + "," + node + ",Entity\n")

with open(edge_file, "w", encoding="utf-8") as fe:
fe.write(":START_ID,:END_ID,:TYPE" + "\n")

with open(txt_file, "r", encoding="utf-8") as ft:
for line in ft:
row = line.rstrip().split()
fe.write("e"+str(node_dict[row[0]]) + "," + "e"+str(node_dict[row[2]]) + "," + row[1] + "\n")


if __name__ == "__main__":
read_write("person.txt", "node.csv", "edge.csv")

处理结果:./zzk/node.csv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
entity:ID,name,:LABEL
e0,一灯大师,Entity
e1,一阳指,Entity
e2,王重阳,Entity
e3,周伯通,Entity
e4,老顽童,Entity
e5,郭靖,Entity
e6,杨康,Entity
e7,杨过,Entity
e8,小龙女,Entity
e9,黄衫女子,Entity
e10,周芷若,Entity
e11,郭襄,Entity
e12,峨嵋派,Entity
e13,张无忌,Entity
e14,张君宝,Entity
e15,武当派,Entity

处理结果:./zzk/edge.csv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
:START_ID,:END_ID,:TYPE
e0,e1,技能/武功
e0,e2,传功
e2,e3,师弟
e3,e4,别名
e3,e5,义弟
e5,e6,义弟
e6,e7,儿子
e7,e8,妻子
e7,e8,师傅
e8,e9,后人
e9,e10,惩戒
e5,e11,女儿
e11,e12,创立
e10,e13,因爱生恨
e14,e15,创立
e13,e14,太师父

导入数据

1
./bin/neo4j-import --into ./data/databases/new_graph.db --nodes ./zzk/node.csv --relationships ./zzk/edge.csv

查看

  • 修改配置文件:vim ./conf/neo4j.conf 第9行 dbms.active_database=new_graph.db
  • 命令:./bin/neo4j console
  • 浏览器:http://localhost:7474

删库跑路

  • rm -rf ./data/databases/new_graph.db
坚持原创技术分享,您的支持将鼓励我继续创作!
0%