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.5 DELETE

  • Neo4j 使用 CQL DELETE 用来:

    • 删除节点
    • 删除节点及相关节点和关系

1.删除节点

  • 语法

  • 示例

2.删除节点和关系

  • 语法

  • 示例

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.5.17 Caption

  • 在 Neo4j 数据中,当我们在 Neo4j DATA 浏览器中执行 MATCH + RETURN 命令以查看 UI 视图中的数据时, 通过使用它们的 Id 属性显示节点和/或关系结果。它被称为 CAPTIONid 属性

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。

  • 案例的节点主要包括人物和城市两类,人物和人物之间有朋友、夫妻等关系,人物和城市之间有出生地的关系。
  1. 首先,我们删除数据库中以往的图,确保一个空白的环境进行操作

  2. 创建人物节点

Note

  • node-name: n
  • node-label-name: Person
  • <id>: 0
  • name: “John”
  1. 创建地区节点

  2. 创建人物之间的关系

  3. 创建人物-地区之间的关系

  4. 查询-所有在 Boston 出生的人物

  5. 查询所有对外有关系的节点

  6. 查询所有有关系的节点

  7. 查询所有对外有关系的节点,以及关系类型

  8. 查询所有有结婚关系的节点

  9. 创建节点的时候就建好关系

  10. 查询某人的朋友的朋友

  11. 增加、修改节点的属性

  12. 删除节点的属性

  13. 删除节点

  14. 删除有关系的节点

  15. 查询所有节点、关系

3.py2neo

  • 安装

    $ pip install --upgrade py2neo
    
  • 使用

    from py2neo import Graph
    
  • 核心 API

    • Graph class

      • Subgraph class

        • Node object
        • Relationship 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)
  • py2neo