[TOC]
# neo4j
- Neo4j是一个世界领先的开源图形数据库,由 Java 编写。图形数据库也就意味着它的数据并非保存在表或集合中,而是保存为节点以及节点之间的关系。
- neo4j的数据由下面几部分组成:
- 节点、边、属性
- 顶点(node)和边(relationship)和属性,无论是顶点还是边,都可以有任意多的属性。属性的存放类似于一个 HashMap,Key 为一个字符串,而 Value 必须是基本类型或者是基本类型数组
- Neo4J中节点和边 都能够包含保存至的属性,此外:
- 可以为节点设置零或多个标签
- 每个关系都对应一种类型。
- 关系总是从一个节点指向另一个节点。
## neo4j简介
- Neo4j 的特点和优势
- SQL就像简单的查询语言语句Neo4j CQL
- 它遵循属性图数据模型
- 它通过使用Apache Lucence支持索引
- 它支持UNIQUE约束
- 它它包含一个用于执行CQL命令的UI:Neo4j数据浏览器
- 它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
- 它采用原生图形库与本地GPE(图形处理引擎)
- 它支持查询的数据导出到JSON和XLS格式
- 它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问
- 它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本
- 它支持两种Java API:Cypher API和Native Java API来开发Java应用程序
### Neo4j优点
- 它很容易表示连接的数据
- 检索/遍历/导航更多的连接数据是非常容易和快速的
- 它非常容易地表示半结构化数据
- Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
- 它使用简单而强大的数据模型
- 它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引
## Neo4j install
- 注意环境变量的更新
- 访问地址:http://localhost:7474
- 修改数据库的文件名称:${NEO4J_HOME}/conf 文件夹
- Neo4j数据构建模块
- 节点、属性、关系、标签、数据浏览器
- 节点:是图的基本单位,它包含具有键值对的属性
- 属性:用于描述节点和关系的键值对
- 关系:是图形数据库的另一个国建模块,链接两个节点。
- 导出的格式:CSV和json
## py2neo
- Py2Neo 是用来对接 Neo4j 的 Python 库。
- install
```
pip install py2neo
```
### Node & relationship
```
# -*- coding:utf-8 -*-
# /usr/bin/python
'''
@Author : Yan Errol
@Describe:
@Evn :
@Date : 2019-08-02 13:59
'''
from py2neo import Node, Relationship,walk,Graph
a = Node('Person', name='Alice')
b = Node('Person', name='Bob')
c = Node('Person', name='Mike')
ab = Relationship(a, "KNOWS", b)
ac = Relationship(a, "KNOWS", c)
w = ab + Relationship(b, "LIKES", c) + ac
for item in walk(w):
print(item)
a = Node('Person', name='Alice')
b = Node('Person', name='Bob')
r = Relationship(a, 'KNOWS', b)
s = a | b | r
# 存储数据库
graph = Graph(password='yel219')
graph.create(w)
# 查询语句
node = graph.match(nodes='Person')
print(node)
relationship = graph.match_one(r_type='KNOWS')
print(relationship)
# update data
# a = Node('Person',name='Alice')
# node = graph.match_one(nodes='Person',r_type='KNOWS')
# node['age']=100
# graph.push(node)
# print(graph.match_one(nodes = 'Person',r_type='KNOWS'))
# delete node
node = graph.match_one(nodes='Person')
relationship = graph.match_one(r_type='KNOWS')
graph.delete(relationship)
graph.delete(node)
```