图数据库之neo4j
一、Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。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的优缺点
(1)优点
①底层数据存储专门针对图形数据的特点进行了优化,在处理关系数据方面比其他数据库有更高的性能。
②专门为关系数据设计的查询语言更便于关系数据的操作。
③没有表结构的概念,它比SQL更灵活。
④自动为数据建立合适的索引(根据数据的标签),避免索引管理的麻烦。
⑤支持高可用主从集群部署。
⑥借助图形平台等辅助工具帮助开发人员快速构建完整的关系数据平台。
(2)neo4j的缺点
①图数据结构导致写入性能差。
②只支持java和基于jvm的语言,社区版不能使用集群。
③社区不够活跃,资料不丰富。
(3)为什么选用Neo4j
Neo4j发布时间早,产品较为成熟稳定,目前是市场使用率最高的图数据库,文档和各种技术博客较多
四、构成包含:节点、属性、关系、标签、数据浏览器
1)节点
节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一 样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。
- 节点是主要的数据元素
- 节点通过关系连接到其他节点
- 节点可以具有一个或多个属性(即,存储为键/值对的属性)
- 节点有一个或多个标签,用于描述其在图表中的作用
2)属性
属性(Property)是用于描述图节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何,Neo4j数据类型来表示。
- 属性是命名值,其中名称(或键)是字符串
- 属性可以被索引和约束
- 可以从多个属性创建复合索引
3)关系
关系(Relationship)同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type) 。
- 关系连接两个节点
- 关系是方向性的
- 节点可以有多个甚至递归的关系
- 关系可以有一个或多个属性(即存储为键/值对的属性)
基于方向性,Neo4j关系被分为两种主要类型:
- 单向关系
- 双向关系
4)标签
标签(Label)将一个公共名称与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们 可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。
- 标签用于将节点分组
- 一个节点可以具有多个标签
- 对标签进行索引以加速在图中查找节点
- 本机标签索引针对速度进行了优化
5)Neo4j Browser
一旦我们安装Neo4j,我们就可以访问Neo4j数据浏览器
五、安装,注意社区版,不能使用集群方式部署,并且有节点和关系数量限制。
version: '3' services: xbd-neo4j: image: neo4j:4.4.25 restart: always container_name: xbd-neo4j privileged: true ports: - 7474:7474 - 7687:7687 environment: - TZ=Asia/Shanghai volumes: - /var/lib/neo4j:/data
六、界面视图
七、基本语法:
1)创建
CREATE (<变量>:<标签> {<属性:JSON格式>}) RETURN <变量> CREATE (n:NODE {name:'node'}) RETURN n
2)删除
MATCH (<变量>:<标签> {<属性:JSON格式>}) DETACH DELETE n MATCH (n:NODE {name:'node'}) DETACH DELETE n
3)合并
MERGE(<变量>:<标签> {<属性:JSON格式>}) RETURN <变量> MERGE (n:NODE {name:"node"}) return n
4)查询
MATCH (<变量>:<标签> {<属性:JSON格式>}) RETURN <变量> MATCH (n:NODE {name:'node'}) RETURN n
八、一些基本操作
1)创建节点
MERGE (node1:NODE {name:"node1", ip:"0.0.0.1"}) return node1 MERGE (node2:NODE {name:"node2", ip:"0.0.0.2"}) return node2 MERGE (node3:NODE {name:"node3", ip:"0.0.0.3"}) return node3
2)更新关系
MATCH (node1:NODE {ip:"0.0.0.1"}), (node2:NODE {ip:"0.0.0.2"}), (node3:NODE {ip:"0.0.0.3"}) MERGE (node1)-[r1:ref]->(node2)-[r2:ref]->(node3) return node1, node2, node3, r1, r2
3)一次性加入节点和关系
MERGE (node4:NODE {name:"node4"})-[r3:ref]->(node5:NODE {name:"node5"})-[r4:ref]->(node6:NODE {name:"node6"}) return node4, node5, node6, r3, r4
4)通用查询
MATCH n=(x:NODE {ip:"0.0.0.1"})-[*]-(y:NODE {ip:"0.0.0.3"}) return n
说明:单节点查询,返回x,y即可
九、测试展示