NLP–Neo4j¶
1.Neo4j 介绍¶
1.1 Neo4j 是什么¶
Neo4j 是什么
Neo4j 是一个世界领先的开源图形数据库。它是由 Neo 技术使用 Java 语言完全开发的。
Neo4j是一个高性能的 NOSQL 图形数据库,它将结构化数据存储在网络上而不是表中。 它是一个嵌入式的、基于磁盘的、具备完全的事务特性的 Java 持久化引擎,但是它将 结构化数据存储在网络(从数学角度叫做图)上而不是表中。
Neo4j 也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员 工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到 具备完全的事务特性、企业级的数据库的所有好处。
Neo4j 管网
Neo4j的特点
Neo4j 是开源的
Neo4j 无 Schema
Neo4j 的查询语言是 Neo4j CQL, 类似 SQL
Neo4j 是一种图形数据库
- 图形数据库是以图形结构的形式存储数据的数据库。它以节点、关系、属性的形式存储应用程序的数据, 正如 RDBMS 以表的“行、列”的形式存储数据,GDBMS 以”图形”的形式存储数据。
Neo4j 遵循 属性图数据模型 存储和管理数据
属性图模型规则如下:
图形是 一组节点 和 连接这些节点的关系
节点 和 关系 包含表示数据的 属性
关系连接节点
关系具有方向:单向、双向
- 在属性图数据模型中,关系应该是定向的,如果尝试创建没有方向的关系,那么将抛出一个错误
- 在 Neo4j 中,关系也应该是有方向性的,如果尝试创建没有方向的关系,那么将抛出一个错误
每个关系包含:
- 开始节点 或 从节点
- 结束节点 或 到节点
属性是用于表示数据的键值对
节点用圆圈表示,关系用方向键表示
Neo4j 是一个流行的图数据库。其他图形数据库有:
- Oracel NoSQL
- OrientDB
- HypherGraphDB
- GraphBase
- InfiniteGraph
- AllegroGraph
Neo4j 通过使用 Apache Lucence 支持索引
Neo4j 支持 UNIQUE 约束
Neo4j 包含一个用于执行 CQL 命令的 UI:Neo4j 数据浏览器
Neo4j 支持完整的 ACID(原子性,一致性,隔离性和持久性)规则
Neo4j 采用原生图形库与本地 GPE(图形处理引擎)
Neo4j 支持查询的数据导出到 JSON 和 XLS 格式
Neo4j 提供了 REST API,可以被任何编程语言 (如Java,Spring,Scala等) 访问
Neo4j 提供了可以通过任何 UI MVC 框架 (如Node JS) 访问的 Java 脚本
Neo4j 支持两种 Java API: Cypher API 和 Native Java API 来开发 Java 应用程序
Neo4j的优点
- 很容易表示连接的数据
- 检索/遍历/导航更多的连接数据是非常容易和快速的
- 非常容易地表示半结构化数据
- Neo4j CQL 查询语言命令是人性化的可读格式,非常容易学习
- 使用简单而强大的数据模型
- 不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引
Neo4j 的缺点、限制
- 节点数、关系、属性的限制
- 不支持 Sharding
Neo4j 构建模块
节点
属性
关系
标签
- Label将一个公共名称与一组节点或关系相关联。 节点或关系可以包含一个或多个标签。 我们可以为现有节点或关系创建新标签。 我们可以从现有节点或关系中删除现有标签。
数据浏览器
1.2 Neo4j 概念详解¶
1.2.1 Neo4j 关系¶
Neo4j 图数据库遵循属性图模型来存储和管理其数据。根据属性图模型,关系应该是定向的, 否则,Neo4j 将抛出一个错误消息。基于方向性,Neo4j 关系被分为两种类型:
- 单向关系
- 双向关系
1.使用新节点创建关系
语法
示例
2.使用已知节点创建带属性的关系
语法
示例
3.检索关系节点的详细信息
语法
示例
4.示例
目标:演示如何使用属性和创建两个节点、两个节点的关系
需求: 创建两个节点:客户节点(Customer)和信用卡节点(CreditCard)
- Customer 节点包含:id, name, dob 属性
- CreditCard 节点包含:id, number, cvv, expiredate 属性
- Customer 与 CreditCard 关系:DO_SHOPPING_WITH
- CreditCard 到 Customer 关系:ASSOCIATED_WITH
步骤:
- 创建 Customer 节点
- 创建 CreditCard 节点
- 观察先前创建的两个节点: Customer 和 CreditCard
- 创建 Customer 和 CreditCard 节点之间的关系
- 查看新创建的关系详细信息
- 详细查看每个节点和关系属性
1.3 Neo4j 安装、使用¶
1.3.1 Neo4j 安装¶
- 首先在 https://neo4j.com/download/ 下载 Neo4j。Neo4j 分为社区版和企业版, 企业版在横向扩展、权限控制、运行性能、HA 等方面都比社区版好,适合正式的生产环境, 普通的学习和开发采用免费社区版就好。
- 在 Mac 或者 Linux 中,安装好 jdk 后,直接解压下载好的 Neo4J 包, 运行
bin/neo4j start
即可
1.3.2 Neo4j 使用¶
- Neo4j 提供了一个用户友好的 web 界面,可以进行各项配置、写入、查询等操作,并且提供了可视化功能。 类似 ElasticSearch 一样。
- 打开浏览器,输入 http://127.0.0.1:7474/browser/,界面最上方就是交互的输入框。
2.Neo4j CQL¶
2.1 CQL 简介¶
Cypher 是 Neo4j 的声明式图形查询语言,允许用户不必编写图形结构的遍历代码, 就可以对图形数据进行高效的查询。Cypher 的设计目的类似 SQL,适合于开发者以 及在数据库上做点对点模式(ad-hoc)查询的专业操作人员。其具备的能力包括:
- 创建、更新、删除节点和关系
- 通过模式匹配来查询和修改节点和关系
- 管理索引和约束等
Neo4j CQL 代表 Neo4j Cypher Query Language
- CQL 是 Neo4j 图形数据库的查询语言
- CQL 是一种声明性模式匹配语言
- CQL 遵循 SQL 语法
- CQL 的语法非常简单且人性化、可读性强
类似 MySQL 一样,在实际的生产应用中,除了简单的查询操作会在 Neo4j 的 web 页面进行外, 一般还是使用 Python、Java 等的 driver 来在程序中实现。
2.2 CQL 命令关键字¶
CQL命令 | 用法 |
---|---|
CREATE | 创建节点、关系、属性 |
MATCH | 检索节点、关系、属性数据 |
RETURN | 返回查询结果 |
WHERE | 提供条件过滤检索数据 |
DELETE | 删除节点、关系 |
REMOVE | 删除节点、关系的属性 |
ORDER BY | 排序检索数据 |
SET | 添加或更新标签 |
2.3 CQL 函数¶
定制列表功能 | 用法 |
---|---|
String | 用于使用 String 字面量 |
Aggregation | 用于对 CQL 查询结果执行一些聚合操作 |
Relationshop | 用于获取关系的细节,startnode, endnode等 |
2.4 CQL 数据类型¶
CQL 数据类型 | 用法 |
---|---|
boolean | 用于表示布尔文字: true, false |
byte | 用于表示8位整数 |
short | 用于表示16位整数 |
int | 用于表示32位整数 |
long | 用于表示64位整数 |
float | I用于表示32位浮点数 |
double | 用于表示64位浮点数 |
char | 用于表示16位字符 |
String | 用于表示字符串 |
2.5 CQL 命令¶
2.5.1 CREATE¶
1.创建没有属性的节点
创建 节点标签名称,相当于 MySQL 数据库中的表名
语法
说明
<node-name>
: 要创建的节点名称<node-label-name>
: 要创建的节点标签- Neo4j 数据库服务器使用
<node-name>
将此节点详细信息存储在 Database.As 中作为 Neo4j DBA 或 Developer, 不能使用它来访问节点详细信息。- Neo4j 数据库服务器创建一个
<node-label-name>
作为内部节点名称的别名,作为 Neo4j DBA 或 Developer,应该使用此标签名称来访问节点详细信息。示例
2.创建具有属性的节点
创建一个具有一些属性(键-值对)的节点来存储数据
语法
示例
3.创建多个标签的节点
语法
示例
2.5.2 CREATE…MATCH…RETURN¶
Neo4j CQL
MATCH
命令用于:
- 从数据库获取有关节点和属性的数据
- 从数据库获取有关节点、关系和属性的数据
- 不能单独使用 MATCH 命令从数据库检索数据。 如果单独使用它,将 InvalidSyntax 错误
Neo4j CQL
RETURN
用于:
- 检索节点的某些属性
- 检索节点的所有属性
- 检索节点和关联关系的某些属性
- 检索节点和关联关系的所有属性
语法
示例 1:
2.5.4 WHERE¶
Neo4j CQL
WHERE
过滤MATCH
查询的结果
语法
<comparison-operator>
:
=
<>
<
>
<=
>=
<boolean-operator>
- AND
- OR
- NOT
- XOR
使用 WHERE 子句创建关系
语法
示例
示例
2.5.6 REMOVE¶
Neo4j CQL
REMOVE
删除节点或关系的现有属性语法
示例1
示例2
2.5.7 SET¶
Neo4j CQL 已提供 SET 子句来执行以下操作:
- 向现有节点或关系添加新属性
- 添加或更新属性值
语法
示例
2.5.8 ORDER BY¶
Neo4j CQL
ORDER BY
对 MATCH 查询返回的结果进行排序语法
ORDER BY <property-name-list> [DESC]
- ORDDR BY
<node-label-name>.<property1-name> [DESC], <node-label-name>.<property2-name> [DESC], …. <node-label-name>.<propertyn-name> [DESC]
示例
2.5.9 Sorting¶
2.5.10 UNION¶
Neo4j CQL 与 SQL 一样,有两个语句可以将两个不同的结果合并成一组结果
UNION
将两组结果中的公共行组合并返回到一组结果中, 会进行去重
限制
- 结果列的 名称 和 类型 和来自两组结果的名称、类型必须匹配
语法
示例
UNION ALL
将两组结果中的公共行组合并返回到一组结果中, 不会进行去重
限制
- 结果列的 名称 和 类型 和来自两组结果的名称、类型必须匹配
语法
- 同
UNION
示例
- 同
UNION
2.5.11 LIMIT、SKIP¶
LIMIT
Neo4j CQL 提供
LIMIT
子句来过滤或限制查询返回的行数, 它修剪CQL查询结果集底部的结果语法
示例
SKIP
Neo4j CQL 提供
SKIP
来过滤或限制查询返回的行数, 它修整了CQL查询结果集顶部的结果语法
示例
2.5.12 MERGE¶
Neo4j CQL
MERGE
命令:
- 创建节点,关系和属性
- 为从数据库检索数据
- MERGE 命令是 CREATE 命令和 MATCH 命令的组合
- Neo4j CQL MERGE 命令在图中搜索给定模式,如果存在则返回结果; 如果不存在于图中,则创建新的节点/关系并返回结果
语法
2.5.13 NULL¶
Neo4j CQL 将空值视为对节点或关系的属性的缺失值或未定义值
- 当创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有 NULL 属性值的新节点
示例
2.5.14 IN¶
Neo4j CQL 提供了一个 IN 运算符,以便为 CQL 命令提供值的集合
语法
示例
2.5.15 图形字体¶
使用 Neo4j 数据浏览器来执行和查看 Neo4j CQL 命令或查询的结果, Neo4j 数据浏览器包含两种视图来显示查询结果:
- UI查看
- 网格视图
默认情况下,Neo4j数据浏览器以小字体显示节点或关系图,并在UI视图中显示默认颜色
2.5.16 ID 属性¶
在 Neo4j 中,
Id
是节点和关系的默认内部属性. 这意味着,当我们创建一个新的节点或关系时,Neo4j 数据库服务器将为内部使用分配一个数字。它会自动递增。以相同的方式,Neo4j 数据库服务器为关系分配一个默认 Id 属性
- 节点的 Id 属性的最大值约为 35 亿
- 关系的 Id 属性的最大值约为 35 亿
2.6 CQL 函数¶
2.6.1 Neo4j CQL 字符串函数¶
Neo4J CQL 提供了一组 String 函数,用于在 CQL 查询中获取所需的结果
- UPPER
- LOWER
- SUBSTRING
- REPLACE
2.6.2 Neo4j CQL AGGREGATION 聚合函数¶
Neo4j CQL 提供了一些在 RETURN 子句中使用的聚合函数
- COUNT
- MAX
- MIN
- SUM
- AVG
2.6.3 Neo4j CQL 关系函数¶
Neo4j CQL 提供了一组关系函数,以在获取开始节点,结束节点等细节时知道关系的细节
- STARTNODE
- ENDNODE
- ID
- TYPE
2.7 Admin 管理员¶
2.7.1 Neo4j 数据库备份和恢复¶
2.7.2 Neo4j CQL 索引¶
2.7.3 Neo4j CQL UNIQUE 约束¶
2.7.4 Neo4j CQL DROP UNIQUE¶
2.8 Neo4j 实战¶
本文通过一个实际的案例来一步一步教你使用 Cypher 来操作 Neo4j。
- 案例的节点主要包括人物和城市两类,人物和人物之间有朋友、夫妻等关系,人物和城市之间有出生地的关系。
首先,我们删除数据库中以往的图,确保一个空白的环境进行操作
创建人物节点
Note
- node-name: n
- node-label-name: Person
- <id>: 0
- name: “John”
创建地区节点
创建人物之间的关系
创建人物-地区之间的关系
查询-所有在 Boston 出生的人物
查询所有对外有关系的节点
查询所有有关系的节点
查询所有对外有关系的节点,以及关系类型
查询所有有结婚关系的节点
创建节点的时候就建好关系
查询某人的朋友的朋友
增加、修改节点的属性
删除节点的属性
删除节点
删除有关系的节点
查询所有节点、关系
3.py2neo¶
安装
$ pip install --upgrade py2neo
使用
from py2neo import Graph
核心 API
Graph
classSubgraph
classNode
objectRelationship
object
2.1 py2neo.database¶
from py2neo import Graph
graph = Graph(password = "password")
graph.run("UNWIND range(1, 3) AS n RETURN n, n * n as n_sq").to_table()
2.1.1 连接¶
GraphService objects
Graph
- auto
- begin
- call
- create
- delete
- delete_all()
- evaluate
- exists
- match
- match_one
- merge
- name
- nodes
- play
- pull
- push(subgraph)
read(cypher, parameters = None, **kwargs)
- relationships
run(cypher, parameters = None, **kwargs)
- schema
- separate
- service
SystemGraph objects
Schema objects
GraphService objects
ProcedureLibrary objects
Procedure objects
- class py2neo.database.Procedure(graph, name)