图数据库Neo4j
docker安装neo4j
- 拉取镜像
docker pull neo4j
- 查看镜像的配置
在ContainerConfig配置块中记录了容器的默认配置,包括暴露端口、环境变量等信息。
docker image inspect neo4j
- 运行容器
在后台运行容器,容器起名neo4j。neo4j支持bolt、http和https三种网络协议,7473、7474端口用于管理界面,7687端口用于登录连接neo4j的服务端。7473是https端口,7474是http端口。
docker run -d --name neo4j -p 7474:7474 -p 7687:7687 --env NEO4J_AUTH=neo4j/12345678 neo4j
# 挂载一些目录,root用户访问不了neo4j用户的目录,需要指定全路径/var/lib/neo4j/data
docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -e NEO4J_AUTH=neo4j/12345678 \
-v /usr/local/soft/neo4j/data:/var/lib/neo4j/data \
-v /usr/local/soft/neo4j/logs:/var/lib/neo4j/logs \
-v /usr/local/soft/neo4j/conf:/var/lib/neo4j/conf \
-v /usr/local/soft/neo4j/import:/var/lib/neo4j/import neo4j
- 容器开机自启
docker update --restart=always neo4j
docker restart neo4j
- 浏览器访问web登陆台,输入用户名密码后登录neo4j
http://192.168.182.171:7474/browser/
图数据库介绍
- 图数据库是以点、边为基础存储单元,以高效存储、查询图数据为设计原理的数据管理系统。图是一组点和边的集合,“点”表示实体,“边”表示实体间的关系。图数据库可以直观地可视化关系,是存储、查询、分析高度互联数据的最优方法。图数据库的主要应用为
联机事务处理(OLTP)
,针对数据做事务处理,图引擎用于联机分析处理(OLAP)
,进行数据的批量分析。常见的图数据库包括Neo4j、GraphDB、HugeGraph等。 - 图模型主要包含属性图和RDF图两种。属性图模型由顶点、边及其属性构成,顶点和边都可以包含属性,节点可以通过标签进行分组,表示关系的边是从一个开始点指向一个结束点,而且边一定是有方向的,也就可以表示有向图,关系上的属性可以为节点的关系提供额外的元数据和语义。RDF模型在顶点和边上没有属性,只有一个资源描述符。
- 图数据库的特点
(1)更直观的模型:图模型可以直接还原业务场景,相比传统数据模型更直观,提升产品与工程师的沟通效率;
(2)更简洁的查询语言:图数据库支持查询语言在关联查询中更简洁;
(3)更高效的关联查询性能:图数据库在处理关联性强的数据以及天然的图问题场景时具有强大的关联查询性能优势。
NoSQL数据库对比
类型 | 数据模型 | 优点 | 缺点 | 代表产品 |
---|---|---|---|---|
键值存储数据库 | 哈希表 | 查找速度快,适用于缓存、键值对操作 | 数据无结构化,通常只被当做字符串或二进制数据 | Redis,Memcached |
列族存储数据库 | 列式数据存储 | 查找速度快,分布横向扩展,数据压缩率高,适用于分布式数据存储、分布式处理、分布式事务 | 功能相对受限 | Cassandra,HBase |
文档型数据库 | 键值对扩展 | 数据结构要求不严格,表结构可变,适用于存储、分析、扩展非结构化数据 | 查询性能不高,缺乏统一的查询语法 | MongoDB,CouchDB |
图形数据库 | 节点和关系组成的图 | 可以利用图结构相关算法,适用于复杂关系网络、推荐系统、社交网络分析 | 可能需要对整个图做计算,不利于图数据分布存储 | Neo4j,InfoGrid |
Neo4j简介
-
Neo4j是一个高性能的开源的NoSQL图形数据库,把结构化数据存储在网络上而不是表中。Neo4j是一个嵌入式的、基于磁盘的、具有事务特性的Java持久化引擎,
-
Neo4j的特点
(1)Neo4j使用的查询语言Cypher类似于SQL,容易入门;
(2)采用属性图模型,节点和关系都可以设置属性,支持索引包括UNIQUE约束,支持完整ACID事务规则;
(3)提供了REST API,可以被任何编程语言访问;
(4)查询的数据可以导出到JSON、Excel等。
Cypher语法
-
Cypher语言是一种声明式模式匹配语言,基本语法包括节点、关系和模式,以及一些内置函数和操作符。
-
节点在Cypher中使用一对圆括号表示,比如(n)。节点可以带属性和标签,比如(n:Animal{name:“小狗”})。
-
关系在Cypher中使用一对短横线表是,比如-[]-。关系可以带有方向和类型,比如-[R]->或-[R:TYPE]->。
-
模式是将节点和关系的语法组合在一起,用于表达查询中的特定结构,比如(a)-[r]->(b)表示从节点a通过关系r指向节点b的路径。
-
Cypher支持各种数学(
+、-、*、/、%、^
)、比较(=、<>、<、>、<=、>=
)、布尔(AND、OR\XOR、NOT
)和列表操作符,以及字符串函数、聚合函数等。 -
Cypher的查询结构包括匹配MATCH、创建CREATE、合并MERGE、关系创建CREATE RELATIONSHIP、删除DELETE、返回RETURN、删除节点和关系的属性REMOVE、排序ORDER BY、添加或更新标签SET、提供条件过滤WHERE等关键字的组合使用等。
-
使用示例
(1)获取所有节点
match (n) return n
(2)创建一个节点
CREATE (charlie:Person:Actor {name: 'Charlie Sheen'}), (oliver:Person:Director {name: 'Oliver Stone'})
(3)创建关系
CREATE (charlie:Person:Actor {name: 'Charlie Sheen'})-[:ACTED_IN {role: 'Bud Fox'}]->(wallStreet:Movie {title: 'Wall Street'})<-[:DIRECTED]-(oliver:Person:Director {name: 'Oliver Stone'})
(4)删除节点
//删除节点(不存在关系)
match (n:Person{name:'张三'}) delete n
//删除关系
match (n:Person{name:'张三'})<-[r]-(m) delete r return type(r)
(5)导入csv数据到Neo4j中
//导入远程数据
LOAD CSV FROM 'https://data.neo4j.com/bands/artists.csv'
AS row
MERGE (:Artist {name: row[1], year: toInteger(row[2])})
//导入本地数据,csv文件需要放到neo4j的import目录
LOAD CSV FROM 'file:///artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year
(6)删除属性和标签
//移除一个属性,age返回为空
match (a{name:'Andy'}) remove a.age return a.name, a.age
//移除一个标签
match (n{name:'Peter'}) remove n:German return n.name, labels(n)
//移除所有的属性不能使用remove,使用SET
match (p{name:'Peter'}) set p={} return p.name,p.age
//移除多个标签
match (n {name:'Peter'}) remove n:German:Swedish return n.name,labels(n)