Neo4j 简明教程
Neo4j - Overview
Neo4j 是全球领先的开源图数据库,使用 Java 技术开发。它具有高度的可扩展性和无模式(NoSQL)。
What is a Graph Database?
图是对象集的直观表示,其中一些对象对通过链接连接。它由两个元素组成——节点(顶点)和关系(边)。
图形数据库是一个用于以图形形式对数据建模的数据库。在此,图的节点描绘实体,而关系描绘这些节点的关联。
Popular Graph Databases
Neo4j 是一个流行的图形数据库。其他图形数据库包括 Oracle NoSQL 数据库、OrientDB、HypherGraphDB、GraphBase、InfiniteGraph 和 AllegroGraph。
Advantages of Neo4j
以下是 Neo4j 的优势。
-
Flexible data model − Neo4j 提供了一个灵活简单但强大的数据模型,可以根据应用程序和行业轻松更改该数据模型。
-
Real-time insights − Neo4j 根据实时数据提供结果。
-
High availability − Neo4j 对于具有事务保证的大型企业实时应用程序具有很高的可用性。
-
Connected and semi structures data − 使用 Neo4j,您可以轻松表示连接和半结构化数据。
-
Easy retrieval − 与其他数据库相比,使用 Neo4j,您不仅可以表示连接的数据,还可以在更短的时间内轻松检索(遍历/导航)连接的数据。
-
Cypher query language − Neo4j 提供了一个声明性查询语言来表示图形,使用的是 ascii-art 语法。此语言的命令采用人类可读格式,且很容易学习。
-
No joins − 使用 Neo4j,不需要复杂的连接来检索连接/相关数据,因为它非常容易在没有连接或索引的情况下检索相邻节点或关系详细信息。
Features of Neo4j
以下是 Neo4j 的显著特征 −
-
Data model (flexible schema) − Neo4j 遵循名为本地属性图模型的数据模型。在这里,图形包含节点(实体),这些节点相互连接(由关系表示)。节点和关系以属性的形式存储数据,单个属性以键值对形式存储。在 Neo4j 中,不需要遵循固定的模式。您可以根据要求添加或删除属性。它还提供模式约束。
-
ACID properties − Neo4j 支持完全 ACID(原子性、一致性、隔离性和持久性)规则。
-
Scalability and reliability − 您可以通过增加读/写次数和增加数量来扩展数据库,而无需影响查询处理速度和数据完整性。Neo4j 还为 replication 提供支持,以确保数据安全性和可靠性。
-
Cypher Query Language − Neo4j 提供了一个强大的声明性查询语言,称为 Cypher。它使用 ASCII-art 来描绘图形。Cypher 易于学习,可用于在不使用连接等复杂查询的情况下创建和检索数据之间的关系。
-
Built-in web application − Neo4j 提供了一个内置的 Neo4j Browser Web 应用程序。使用此应用程序,您可以创建和查询您的图形数据。
-
Drivers − Neo4j 可以使用 −REST API 来处理 Java、Spring、Scala 等编程语言。Java Script 可以用来处理类似于 Node JS 的 UI MVC 框架。它支持两种类型的 Java API:Cypher API 和 Native Java API,用来开发 Java 应用程序。除了这些以外,你也可以处理其他数据库,比如 MongoDB、Cassandra 等。
-
Indexing − Neo4j 使用 Apache Lucence 来支持索引。
Neo4j - Data Model
Neo4j Property Graph Data Model
Neo4j 图形数据库遵循属性图形模型来存储和管理其数据。
以下是属性图形模型的关键特性 -
-
该模型使用节点、关系和属性表示数据
-
Properties are key-value pairs
-
节点使用圆圈表示,关系使用箭头键表示
-
关系有方向:单向和双向
-
每个关系都包含“起始节点”或“来自节点”和“目标节点”或“结束节点”
-
节点和关系都包含属性
-
Relationships connects nodes
在属性图形数据模型中,关系应该是方向性的。如果我们尝试创建没有方向的关系,那么它将抛出一个错误消息。
在 Neo4j 中,关系也应该是方向性的。如果我们尝试创建没有方向的关系,那么 Neo4j 将抛出一个错误消息,指出“关系应该是方向性的”。
Neo4j 图形数据库将所有数据存储在节点和关系中。我们既不需要任何附加的 RRBMS 数据库,也不需要任何 SQL 数据库来存储 Neo4j 数据库数据。它以其本机格式以图形的形式存储其数据。
Neo4j 使用 Native GPE(图形处理引擎)来处理其 Native 图形存储格式。
图形数据库数据模型的主要构建模块有 -
-
Nodes
-
Relationships
-
Properties
以下是属性图形的一个简单示例。
在这里,我们使用圆圈表示节点。关系使用箭头表示。关系是方向性的。我们可以用属性(键值对)表示节点的数据。在此示例中,我们在节点的圆圈内表示了每个节点的 ID 属性。
Neo4j - Environment Setup
在本章中,我们将讨论如何使用 exe 文件在系统中安装 Neo4j。
Neo4j Database Server Setup with Windows exe File
按照下列步骤下载 Neo4j 到你的系统中。
Step 1 − 使用 https://neo4j.com/ 访问 Neo4j 官方网站。单击此链接后,你将转到 neo4j 网站的主页。
Step 2 − 如上图所示,此页面在右上角有一个“下载”按钮。单击此按钮。
Step 3 − 你将转到下载页面,你可以在其中下载 Neo4j 的社区版和企业版。单击相应的按钮来下载该软件的社区版。
Step 4 − 你将转到一个页面,你可以在其中下载与不同操作系统兼容的 Neo4j 软件的社区版。下载与所需操作系统相应的该文件。
这会将一个名为 neo4j-community_windows-x64_3_1_1.exe 的文件下载到你的系统中,如下面的截图所示。
Step 5 − 双击 exe 文件以安装 Neo4j Server。
Step 6 − 接受许可证协议并继续安装。在完成此过程后,你可以看到 Neo4j 已安装在你的系统中。
Starting the Server
Step 1 − 单击 Windows 开始菜单,并单击 Neo4j 的开始菜单快捷方式以启动 Neo4j 服务器。
Step 2 - 单击快捷方式后,您将获得 Neo4j Community 版的一个窗口。默认情况下,它选择 c:\Users\[username]\Documents\Neo4j\default.graphdb。如果您愿意,可以将您的路径更改为不同的目录。
Step 3 - 单击“启动”按钮以启动 Neo4j 服务器。
服务器启动后,您可以观察到数据库目录已填充,如下面的屏幕截图所示。
Working with Neo4j
正如前面章节中所讨论的,neo4j 提供了一个内置的浏览应用程序来与 Neo4j 配合使用。您可以使用以下网址访问 Neo4j http://localhost:7474/
Neo4j - Building Blocks
Neo4j 图形数据库具有以下构件 −
-
Nodes
-
Properties
-
Relationships
-
Labels
-
Data Browser
Relationships
关系是图形数据库的另一个主要构建块。它将两个节点连接起来,如下图所示。
这里,Emp 和 Dept 是两个不同的节点。“WORKS_FOR”是 Emp 和 Dept 节点之间的关系。
它表示,从 Emp 到 Dept 的箭头标记描述了 -
Emp WORKS_FOR Dept
每个关系包含一个起始节点和一个结束节点。
在这里,“Emp”是一个起始节点,“Dept”是一个结束节点。
由于该关系箭头标记表示从“Emp”节点到“Dept”节点的关系,因此该关系被称为“Dept”节点的“流入关系”和“Emp”节点的“流出关系”。
与节点一样,关系也可以包含属性作为键值对。
在这里,“WORKS_FOR”关系具有一个属性作为键值对。
Id = 123
它表示该关系的 ID。
Labels
标签为一组节点或关系关联一个通用名称。一个节点或关系可以包含一个或多个标签。我们可以为现有节点或关系创建新标签。我们可以从现有节点或关系中移除现有的标签。
从上一个图表中,我们可以观察到有 2 个节点。
左侧节点具有标签:“Emp”,右侧节点具有标签:“Dept”。
这两个节点之间的关系也具有标签:“WORKS_FOR”。
Note − Neo4j 将数据存储在节点或关系的属性中。
Neo4j Data Browser
一旦我们安装了 Neo4j,我们就可以使用以下 URL 访问 Neo4j 数据浏览器
http://localhost:7474/browser/
Neo4j 数据浏览器用于执行 CQL 命令和查看输出。
在这里,我们需要在美元提示符下执行所有 CQL 命令: "$"
在美元符号后键入命令,然后单击“执行”按钮来运行你的命令。
它与 Neo4j 数据库服务器交互,检索并将结果显示在美元提示符的正下方。
使用“VI 视图”按钮以图表格式查看结果。上图显示了“UI 视图”格式下的结果。
使用“网格视图”按钮以网格视图形式查看结果。下图显示了以“网格视图”格式显示的相同结果。
当我们使用“网格视图”来查看查询结果时,我们可以将其导出到两种不同格式的文件中。
Neo4j CQL - Introduction
CQL 是 Cypher 查询语言的简称。就像 Oracle Database 具有 SQL 查询语言一样,Neo4j 具有 CQL 作为查询语言。
Like Oracle SQL
-
Neo4j CQL 具有执行数据库操作的命令。
-
Neo4j CQL 支持许多子句,例如 WHERE、ORDER BY 等,以便轻松编写极其复杂的查询。
-
Neo4j CQL 支持某些函数,例如 String、Aggregation。此外,它还支持某些关系函数。
Neo4j CQL Clauses
以下是 Neo4j *C*ypher *Q*uery *L*anguage 的读取子句:
Sr.No |
Read Clauses |
Usage |
1 |
MATCH |
此子句用于按照指定模式搜索数据。 |
2 |
OPTIONAL MATCH |
这与匹配相同,唯一不同的是,在缺少模式部分时它可以使用空值。 |
3 |
WHERE |
此子句 id 用于向 CQL 查询添加内容。 |
4 |
START |
此子句用于通过传统索引查找起始点。 |
5 |
LOAD CSV |
此子句用于从 CSV 文件导入数据。 |
以下是 Neo4j *C*ypher *Q*uery *L*anguage 的写入子句:
Sr.No |
Write Clause |
Usage |
1 |
CREATE |
此子句用于创建节点、关系和属性。 |
2 |
MERGE |
此子句验证图中是否存在指定模式。如果不存在,则会创建该模式。 |
3 |
SET |
此子句用于更新节点上的标签、节点上的属性和关系。 |
4 |
DELETE |
此子句用于删除图中的节点和关系或路径等。 |
5 |
REMOVE |
此子句用于删除节点和关系中的属性和元素。 |
6 |
FOREACH |
此类用于更新列表中的数据。 |
7 |
CREATE UNIQUE |
使用 CREATE 和 MATCH 子句,您可以通过匹配现有模式并创建缺少的模式来获得一个唯一模式。 |
8 |
使用 Cypher 导入 CSV 文件 |
使用 Load CSV 可以从 .csv 文件导入数据。 |
以下是 Neo4j *C*ypher *Q*uery *L*anguage 的常用子句 -
Sr.No |
General Clauses |
Usage |
1 |
RETURN |
此子句用于定义查询结果集中应包含的内容。 |
2 |
ORDER BY |
此子句用于按顺序排列查询的输出。它与 RETURN 或 WITH 子句一起使用。 |
3 |
LIMIT |
此子句用于将结果中的行限制为特定值。 |
4 |
SKIP |
此子句用于定义从哪一行开始在输出中包含行。 |
5 |
WITH |
此子句用于将查询部分连接在一起。 |
6 |
UNWIND |
此子句用于将列表展开为一系列行。 |
7 |
UNION |
此子句用于合并多个查询的结果。 |
8 |
CALL |
此子句用于调用在数据库中部署的过程。 |
Neo4j CQL Functions
以下是常用的 Neo4j CQL 函数 -
Sr.No |
CQL Functions |
Usage |
1 |
String |
它们用于使用字符串文本。 |
2 |
Aggregation |
它们用于对 CQL 查询结果执行某些聚合操作。 |
3 |
Relationship |
它们用于获取关系的详细信息,例如 startnode、endnode 等。 |
在后续章节中,我们将详细讨论所有 Neo4j CQL 命令、子句和函数的语法、用法和示例。
Neo4j CQL Data Types
这些数据类型类似于 Java 语言。它们用于定义节点或关系的属性。
Neo4j CQL 支持以下数据类型 −
Sr.No |
CQL Data Type |
Usage |
1 |
Boolean |
它用于表示布尔文字:true、false。 |
2 |
byte |
它用于表示 8 位整数。 |
3 |
short |
它用于表示 16 位整数。 |
4 |
int |
它用于表示 32 位整数。 |
5 |
long |
它用于表示 64 位整数。 |
6 |
float |
它用于表示 32 位浮点数。 |
7 |
double |
它用于表示 64 位浮点数。 |
8 |
char |
它用于表示 16 位字符。 |
9 |
String |
它用于表示字符串。 |
CQL Operators
以下列出了 Neo4j Cypher 查询语言支持的操作符。
Sr.No |
Type |
Operators |
1 |
Mathematical |
+、-、*、/、%、^ |
2 |
Comparison |
+、<>、<、>、⇐、>= |
3 |
Boolean |
AND, OR, XOR, NOT |
4 |
String |
+ |
5 |
List |
+, IN, [X], [X…..Y] |
6 |
Regular Expression |
=- |
7 |
String matching |
STARTS WITH、ENDS WITH、CONSTRAINTS |
Boolean Operators in Neo4j CQL
Neo4j 支持使用 Neo4j CQL WHERE 子句中的以下布尔运算符来支持多个条件。
Sr.No |
Boolean Operators |
Description |
1 |
AND |
这是一个 Neo4j CQL 关键字,用来支持 AND 操作。它就像 SQL AND 算子。 |
2 |
OR |
这是一个 Neo4j CQL 关键字,用来支持 OR 操作。它就像 SQL AND 算子。 |
3 |
NOT |
这是一个 Neo4j CQL 关键字,用来支持 NOT 操作。它就像 SQL AND 算子。 |
4 |
XOR |
这是一个 Neo4j CQL 关键字,用来支持 XOR 操作。它就像 SQL AND 算子。 |
Neo4j CQL - Creating Nodes
正如讨论的那样,一个节点是图数据库中的一个数据/记录。你可以使用 CREATE 从句在 Neo4j 中创建一个节点。本章教你如何 -
-
Create a single node
-
Create multiple nodes
-
使用一个标签创建一个节点
-
使用多个标签创建一个节点
-
使用属性创建一个节点
-
Returning the created node
Creating a Single node
你可以简单地通过指定要创建的节点名称,并使用 CREATE 从句来在 Neo4j 中创建一个节点。
Example
以下是一个示例 Cypher 查询,在 Neo4j 中创建了一个节点。
CREATE (sample)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j 桌面应用程序,并启动 Neo4j 服务器,如下图所示。
Step 2 - 打开你的浏览器,复制代码并粘贴下面的 URL 到你的地址栏 http://localhost:7474/. 这将给你 Neo4j 的内建浏览器应用程序,其中有个美元提示符,如下图所示。
Step 3 - 将目标查询复制并粘贴到美元提示符中,然后按下在以下截图中突出显示的播放按钮(执行查询)。
Creating Multiple Nodes
Neo4j CQL 的 create 子句也用于同时创建多个节点。为此,你需要传递要创建的节点的名称,用逗号分隔。
Example
以下是一个示例 Cypher 查询,在 Neo4j 中创建多个节点。
CREATE (sample1),(sample2)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Creating a Node with a Label
Neo4j 中的标签用于使用标签对节点进行分组(分类)。你可以使用 CREATE 从句为 Neo4j 中的节点创建一个标签。
Example
以下是一个创建带有标签的节点的示例 Cypher 查询。
CREATE (Dhawan:player)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Creating a Node with Multiple Labels
还可以为单个节点创建多个标签。需要通过用冒号“ : ”分隔标签来指定节点的标签。
Example
以下是一个在 Neo4j 中创建带有多个标签的节点的示例 Cypher 查询。
CREATE (Dhawan:person:player)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Create Node with Properties
属性是节点用于存储数据 key-value 对。可以使用 CREATE 子句创建带有属性的节点。需要在花括号“ { }”中用逗号分隔指定这些属性。
Example
以下是一个创建带有属性的节点的示例 Cypher 查询。
CREATE (Dhawan:player{name: "Shikar Dhawan", YOB: 1985, POB: "Delhi"})
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Returning the Created Node
在整个章节中,我们使用 MATCH (n) RETURN n 查询来查看创建的节点。此查询返回数据库中所有现有的节点。
我们能够使用 RETURN 子句和 CREATE 来代替上述方法来查看新创建的节点。
Example
以下是一个创建带有属性并返回该属性的节点的示例 Cypher 查询。
CREATE (Dhawan:player{name: "Shikar Dhawan", YOB: 1985, POB: "Delhi"}) RETURN Dhawan
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j CQL - Creating a Relationship
在 Noe4j 中,关系是一个元素,我们使用它来连接图中的两个节点。这些关系具有方向、类型和数据形式模式。本章将介绍如何:
-
Create relationships
-
在现有节点之间创建关系
-
创建具有标签和属性的关系
Creating Relationships
我们可以使用 CREATE 子句创建一个关系。我们将根据关系的方向在方括号 “[ ]” 中指定关系,因为它是放在连字符 “ - ” 和箭头 “ → ” 之间的,如下所示语法中所示。
Example
首先,在数据库中创建两个节点 Ind 和 Dhawan,如下所示。
CREATE (Dhawan:player{name: "Shikar Dhawan", YOB: 1985, POB: "Delhi"})
CREATE (Ind:Country {name: "India"})
现在,在两个节点之间创建一个名为 BATSMAN_OF 的关系,如下所示:
CREATE (Dhawan)-[r:BATSMAN_OF]->(Ind)
最后,返回两个节点以查看已创建的关系。
RETURN Dhawan, Ind
将所需查询复制并粘贴到美元提示符中,然后按下以下屏幕截图中突出显示的播放按钮(以执行查询)。
Creating a Relationship Between the Existing Nodes
你还可以使用 MATCH 子句在现有节点之间创建关系。
Syntax
以下是使用 MATCH 子句创建关系的语法。
MATCH (a:LabeofNode1), (b:LabeofNode2)
WHERE a.name = "nameofnode1" AND b.name = " nameofnode2"
CREATE (a)-[: Relation]->(b)
RETURN a,b
Example
以下就是一个使用 match 子句创建关系的 Cypher 查询示例。
MATCH (a:player), (b:Country) WHERE a.name = "Shikar Dhawan" AND b.name = "India"
CREATE (a)-[r: BATSMAN_OF]->(b)
RETURN a,b
要执行以上查询,请执行以下步骤。
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Creating a Relationship with Label and Properties
可以使用 CREATE 子句创建带有标签和属性的关系。
Syntax
下面是使用 CREATE 子句创建带有标签和属性的关系的语法。
CREATE (node1)-[label:Rel_Type {key1:value1, key2:value2, . . . n}]-> (node2)
Example
下面是一个示例 Cypher 查询,它创建了一个带有标签和属性的关系。
MATCH (a:player), (b:Country) WHERE a.name = "Shikar Dhawan" AND b.name = "India"
CREATE (a)-[r:BATSMAN_OF {Matches:5, Avg:90.75}]->(b)
RETURN a,b
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Creating a Complete Path
在 Neo4j 中,关系连续使用路径进行形成。可以使用 create 子句创建路径。
Syntax
下面是使用 CREATE 子句在 Neo4j 中创建路径的语法。
CREATE p = (Node1 {properties})-[:Relationship_Type]->
(Node2 {properties})[:Relationship_Type]->(Node3 {properties})
RETURN p
Example
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Merge Command
MERGE 命令是 CREATE 命令和 MATCH 命令的组合。
Neo4j CQL MERGE 命令在图中搜索给定的模式。如果存在,则它返回结果。
如果在图中不存在,则它创建一个新节点/关系并返回结果。
在本章中,你将学习如何 −
-
合并带有标签的节点
-
合并带有属性的节点
-
OnCreate and OnMatch
-
Merge a relationship
Syntax
下面是 MERGE 命令的语法。
MERGE (node: label {properties . . . . . . . })
在继续本节中的示例之前,请在数据库中创建两个带有标签 Dhawan 和 Ind 的节点。创建从 Dhawan 到 Ind 的类型为 “BATSMAN_OF” 的关系,如下所示。
CREATE (Dhawan:player{name: "Shikar Dhawan", YOB: 1985, POB: "Delhi"})
CREATE (Ind:Country {name: "India"})
CREATE (Dhawan)-[r:BATSMAN_OF]->(Ind)
Merging a Node with a Label
可以使用 MERGE 子句根据标签合并数据库中的节点。如果尝试根据标签合并节点,则 Neo4j 会验证是否存在带有给定标签的任何节点。如果没有,将创建当前节点。
Example 1
下面是一个 Cypher 查询示例,它将一个节点合并到 Neo4j 中(根据标签)。执行此查询时,Neo4j 会验证是否存在任何标签为 player 的节点。如果没有,它会创建一个名为 “Jadeja” 的节点并返回它。
如果存在任何带有给定标签的节点,Neo4j 会返回它们全部。
MERGE (Jadeja:player) RETURN Jadeja
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Example 2
现在,尝试合并一个名为 “CT2013” 的节点,其标签名为 Tournament。由于没有带有此标签的节点,Neo4j 会创建一个带有给定名称的节点并返回它。
MERGE (CT2013:Tournament{name: "ICC Champions Trophy 2013"})
RETURN CT2013, labels(CT2013)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。使用 URL 打开 Neo4j 的内置浏览器应用程序 http://localhost:7474/ ,如下图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Merging a Node with Properties
您还可以使用一组属性合并节点。如果您这样做,Neo4j 将搜索与指定节点相等的匹配项,包括属性。如果找不到任何匹配项,则创建一个匹配项。
Example
以下是一个示例 Cypher 查询,用于使用属性合并节点。此查询尝试使用属性和标签合并名为 “jadeja” 的节点。由于没有具有确切标签和属性的此类节点,因此 Neo4j 创建了一个。
MERGE (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"})
RETURN Jadeja
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。使用 URL 打开 Neo4j 的内置浏览器应用程序 http://localhost:7474/ ,如下图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
OnCreate and OnMatch
每当我们执行合并查询时,一个节点要么匹配,要么创建。使用 on create 和 on match,您可以设置属性来指示节点是创建还是匹配。
Syntax
以下是 OnCreate 和 OnMatch 子句的语法。
MERGE (node:label {properties . . . . . . . . . . .})
ON CREATE SET property.isCreated ="true"
ON MATCH SET property.isFound ="true"
Example
以下是一个示例 Cypher 查询,演示了在 Neo4j 中使用 OnCreate 和 OnMatch 子句。如果指定的节点已存在于数据库中,则将匹配该节点并在该节点中创建具有键值对 isFound = "true" 的属性。
如果指定的节点不存在于数据库中,则将创建该节点,并在其中创建具有键值对 isCreated ="true" 的属性。
MERGE (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"})
ON CREATE SET Jadeja.isCreated = "true"
ON MATCH SET Jadeja.isFound = "true"
RETURN Jadeja
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Merge a Relationship
就像节点一样,您还可以使用 MERGE 子句合并关系。
Example
以下是一个示例 Cypher 查询,它使用 Neo4j 中的 MATCH 子句合并关系。此查询尝试合并节点 “ind”(标签:国家和名称:印度)和 ICC13(标签:锦标赛和名称:ICC 冠军奖杯 2013)之间的名为 WINNERS_OF 的关系。
由于不存在此类关系,因此 Neo4j 创建了一个。
MATCH (a:Country), (b:Tournament)
WHERE a.name = "India" AND b.name = "ICC Champions Trophy 2013"
MERGE (a)-[r:WINNERS_OF]->(b)
RETURN a, b
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Set Clause
使用 Set 子句,可以向现有节点或关系添加新属性,也可以添加或更新现有属性值。
在本节中,我们将探讨如何 −
-
Set a property
-
Remove a property
-
Set multiple properties
-
设置节点上的标签
-
在节点上设置多个标签
Setting a Property
使用 SET 子句,可以在节点中创建新属性。
Syntax
以下是设置属性的语法。
MATCH (node:label{properties . . . . . . . . . . . . . . })
SET node.property = value
RETURN node
Example
在继续案例之前,请首先像下面所示的那样创建一个名为 Dhawan 的节点。
CREATE (Dhawan:player{name: "shikar Dhawan", YOB: 1985, POB: "Delhi"})
下面的示例 Cypher 查询用于创建一个名为“highestscore”的属性,其值为“187”。
MATCH (Dhawan:player{name: "shikar Dhawan", YOB: 1985, POB: "Delhi"})
SET Dhawan.highestscore = 187
RETURN Dhawan
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用程序,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Removing a Property
您可以通过将 NULL 作为其值传递来删除现有属性。
Syntax
以下是使用 SET 子句从节点中删除属性的语法。
MATCH (node:label {properties})
SET node.property = NULL
RETURN node
Example
在继续案例之前,请首先像下面所示的那样创建一个“jadeja”节点。
Create (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"})
下面是一个示例 Cypher 查询,它使用 SET 子句从该节点中删除名为 POB 的属性,如下所示。
MATCH (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"})
SET Jadeja.POB = NULL
RETURN Jadeja
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Setting Multiple Properties
同样,您可以使用 Set 子句在节点中创建多个属性。为此,您需要用逗号指定这些键值对。
Syntax
以下是使用 SET 子句在节点中创建多个属性的语法。
MATCH (node:label {properties})
SET node.property1 = value, node.property2 = value
RETURN node
Example
下面是一个示例 Cypher 查询,它在 Neo4j 中使用 SET 子句在节点中创建多个属性。
MATCH (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988})
SET Jadeja.POB: "NavagamGhed", Jadeja.HS = "90"
RETURN Jadeja
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Setting a Label on a Node
您可以使用 SET 子句将标签设置为现有节点。
Example
在继续案例之前,请首先像下面所示的那样创建一个“Anderson”节点。
CREATE (Anderson {name: "James Anderson", YOB: 1982, POB: "Burnely"})
以下是一个示例 Cypher 查询,用于使用 SET 子句在节点上设置标签。该查询将标签“player”添加到节点 Anderson 并返回它。
MATCH (Anderson {name: "James Anderson", YOB: 1982, POB: "Burnely"})
SET Anderson: player
RETURN Anderson
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Setting Multiple Labels on a Node
您可以使用 SET 子句将多个标签设置为现有节点。您需要用冒号“:”将其分隔来指定标签。
Syntax
以下是使用 SET 子句设置现有节点的多个标签的语法。
MATCH (n {properties . . . . . . . })
SET n :label1:label2
RETURN n
Example
在继续执行示例之前,首先创建一个名为“Ishant”的节点,如下所示。
CREATE (Ishant {name: "Ishant Sharma", YOB: 1988, POB: "Delhi"})
以下是用于使用 SET 子句对某个节点创建多个标签的 Cypher 查询示例。
MATCH (Ishant {name: "Ishant Sharma", YOB: 1988, POB: "Delhi"})
SET Ishant: player:person
RETURN Ishant
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Delete Clause
你可以使用 DELETE 子句从数据库删除节点和关系。
Deleting All Nodes and Relationships
以下是使用 DELETE 子句从数据库删除所有节点和关系的查询:
Query
MATCH (n) DETACH DELETE n
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
这将删除 neo4j 数据库中的所有节点和关系并使其变空。
Deleting a Particular Node
要删除具体节点,您需要在以上查询中将其详细信息指定在“n”的位置。
Syntax
以下是使用 DELETE 子句从 Neo4j 中删除具体节点的语法。
MATCH (node:label {properties . . . . . . . . . . })
DETACH DELETE node
Example
在继续举例之前,请按照以下指示在 Neo4j 数据库中创建一个名为“Ishant”的节点。
CREATE (Ishant:player {name: "Ishant Sharma", YOB: 1988, POB: "Delhi"})
以下是一个使用 DELETE 子句删除上述创建节点的示例 Cypher 查询。
MATCH (Ishant:player {name: "Ishant Sharma", YOB: 1988, POB: "Delhi"})
DETACH DELETE Ishant
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Remove Clause
REMOVE 子句用于从图元素(节点或关系)中移除属性和标签。
Neo4j CQL DELETE 和 REMOVE 命令之间的主要区别是 −
-
DELETE 操作用于删除节点和关联的关系。
-
REMOVE 操作用于删除标签和属性。
Removing a Property
你可以使用 MATCH 和 REMOVE 子句来删除节点的属性。
Syntax
以下是使用 REMOVE 子句删除节点属性的语法。
MATCH (node:label{properties . . . . . . . })
REMOVE node.property
RETURN node
Example
在继续执行示例之前,创建一个名为 Dhoni 的节点,如下所示。
CREATE (Dhoni:player {name: "MahendraSingh Dhoni", YOB: 1981, POB: "Ranchi"})
以下是使用 REMOVE 子句删除以上创建的节点的示例 Cypher 查询。
MATCH (Dhoni:player {name: "MahendraSingh Dhoni", YOB: 1981, POB: "Ranchi"})
REMOVE Dhoni.POB
RETURN Dhoni
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Removing a Label From a Node
类似于属性,你也可以使用 remove 子句从现有节点中删除标签。
Syntax
以下是用于从节点中删除标签的语法。
MATCH (node:label {properties . . . . . . . . . . . })
REMOVE node:label
RETURN node
Example
以下是使用 remove 子句从现有节点中删除标签的示例 Cypher 查询。
MATCH (Dhoni:player {name: "MahendraSingh Dhoni", YOB: 1981, POB: "Ranchi"})
REMOVE Dhoni:player
RETURN Dhoni
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Removing Multiple Labels
你也可以从现有节点中删除多个标签。
Syntax
以下是从节点中删除多个标签的语法。
MATCH (node:label1:label2 {properties . . . . . . . . })
REMOVE node:label1:label2
RETURN node
Example
在继续执行示例之前,创建一个称为 Ishant 的节点,如下所示。
CREATE (Ishant:player:person {name: "Ishant Sharma", YOB: 1988, POB: "Delhi"})
以下是从节点中删除多个标签的示例 Cypher 查询。
MATCH (Ishant:player:person {name: "Ishant Sharma", YOB: 1988, POB: "Delhi"})
REMOVE Ishant:player:person
RETURN Ishant
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Foreach Clause
FOREACH 子句用于更新列表中的数据,无论这些数据是路径的组件还是聚合的结果。
Syntax
以下是 FOREACH 子句的语法。
MATCH p = (start node)-[*]->(end node)
WHERE start.node = "node_name" AND end.node = "node_name"
FOREACH (n IN nodes(p)| SET n.marked = TRUE)
Example
在继续示例之前,请按如下所示在 Neo4j 数据库中创建一个路径 p 。
CREATE p = (Dhawan {name:"Shikar Dhawan"})-[:TOPSCORRER_OF]->(Ind{name:
"India"})-[:WINNER_OF]->(CT2013{name: "Champions Trophy 2013"})
RETURN p
以下是一个使用 FOREACH 子句为路径中的所有节点添加属性的示例 Cypher 查询。
MATCH p = (Dhawan)-[*]->(CT2013)
WHERE Dhawan.name = "Shikar Dhawan" AND CT2013.name = "Champions Trophy 2013"
FOREACH (n IN nodes(p)| SET n.marked = TRUE)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Match Clause
在本章中,我们将了解 Match 子句以及可以用此子句执行的所有函数。
Get All Nodes Using Match
使用 Neo4j 的 MATCH 子句,可以检索 Neo4j 数据库中的所有节点。
Example
在继续执行示例之前,请创建 3 个节点和 2 个关系,如下所示。
CREATE (Dhoni:player {name: "MahendraSingh Dhoni", YOB: 1981, POB: "Ranchi"})
CREATE (Ind:Country {name: "India", result: "Winners"})
CREATE (CT2013:Tornament {name: "ICC Champions Trophy 2013"})
CREATE (Ind)-[r1:WINNERS_OF {NRR:0.938 ,pts:6}]->(CT2013)
CREATE(Dhoni)-[r2:CAPTAIN_OF]->(Ind)
CREATE (Dhawan:player{name: "shikar Dhawan", YOB: 1995, POB: "Delhi"})
CREATE (Jadeja:player {name: "Ravindra Jadeja", YOB: 1988, POB: "NavagamGhed"})
CREATE (Dhawan)-[:TOP_SCORER_OF {Runs:363}]->(Ind)
CREATE (Jadeja)-[:HIGHEST_WICKET_TAKER_OF {Wickets:12}]->(Ind)
以下查询返回 Neo4j 数据库中的所有节点。
MATCH (n) RETURN n
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Getting All Nodes Under a Specific Label
使用 Match 子句,您可以获取特定标签下的所有节点。
Example
下面是一个返回数据库中带有标签 player 的所有节点的示例 Cypher 查询。
MATCH (n:player)
RETURN n
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Match by Relationship
您可以使用 MATCH 子句基于关系检索节点。
Example
以下是一个基于关系使用 MATCH 子句来检索节点的示例 Cypher 查询。
MATCH (Ind:Country {name: "India", result: "Winners"})<-[: TOP_SCORER_OF]-(n)
RETURN n.name
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Delete All Nodes
您可以使用 MATCH 子句删除所有节点。
Query
以下是删除 Neo4j 中所有节点的查询。
MATCH (n) detach delete n
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Optional Match Clause
OPTIONAL MATCH 子句用于搜索其中描述的模式,同时对模式的缺失部分使用 null。
OPTIONAL MATCH 与 match 子句相似,唯一的区别是它返回 null 作为模式缺失部分的结果。
Syntax
以下是 OPTIONAL MATCH 与关系的语法。
MATCH (node:label {properties. . . . . . . . . . . . . .})
OPTIONAL MATCH (node)-->(x)
RETURN x
Example
以下就是一个尝试从节点 ICCT2013 中检索关系的 Cypher 查询示例。由于没有这样的节点,所以它返回 null。
MATCH (a:Tornament {name: "ICC Champions Trophy 2013"})
OPTIONAL MATCH (a)-->(x)
RETURN x
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Where Clause
与 SQL 类似,Neo4j CQL 在 CQL MATCH 命令中提供了 WHERE 子句以过滤 MATCH 查询的结果。
Example
在继续执行示例之前,请按照以下方式在数据库中创建五个节点。
CREATE(Dhawan:player{name:"shikar Dhawan", YOB: 1985, runs:363, country: "India"}
CREATE(Jonathan:player{name:"Jonathan Trott", YOB:1981, runs:229, country:"South Africa"}
CREATE(Sangakkara:player{name:"Kumar Sangakkara", YOB:1977, runs:222,
country:"Srilanka"})
CREATE(Rohit:player{name:"Rohit Sharma", YOB: 1987, runs:177, country:"India"})
CREATE(Virat:player{name:"Virat Kohli", YOB: 1988, runs:176, country:"India"})
CREATE(Ind:Country {name: "India", result: "Winners"})
以下是使用 WHERE 子句返回所有属于印度的球员(节点)的示例 Cypher 查询。
MATCH (player)
WHERE player.country = "India"
RETURN player
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
WHERE Clause with Multiple Conditions
您还可以使用 WHERE 子句验证多个条件。
Syntax
以下是具有多个条件在 Neo4j 中使用 WHERE 子句的语法。
MATCH (emp:Employee)
WHERE emp.name = 'Abc' AND emp.name = 'Xyz'
RETURN emp
Example
以下是使用两种条件在 Neo4j 数据库中过滤节点的示例 Cypher 查询。
MATCH (player)
WHERE player.country = "India" AND player.runs >=175
RETURN player
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Using Relationship with Where Clause
您还可以使用 Where 子句使用关系来过滤节点。
Example
假设我们有数据库中的以下图表。
以下是如下所示使用 WHERE 子句检索印度最高得分的示例 Cypher 查询。
MATCH (n)
WHERE (n)-[: TOP_SCORER_OF]->( {name: "India", result: "Winners"})
RETURN n
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Count Function
假设我们在数据库中创建了具有以下详细信息的图表。
Count
count() 函数用于统计行数。
Example
以下是演示 count() 函数用法的一个 Cypher 查询示例。
Match(n{name: "India", result: "Winners"})--(x)
RETURN n, count(*)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Group Count
COUNT 子句还用于统计关系类型组。
Example
以下是统计参与每个关系的节点的数量并返回的 Cypher 查询示例。
Match(n{name: "India", result: "Winners"})-[r]-(x)
RETURN type (r), count(*)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Return Clause
RETURN 子句用来返回 Neo4j 中的节点、关系和属性。在本章中,我们将学习如何 −
-
Return nodes
-
Return multiple nodes
-
Return relationships
-
Return properties
-
Return all elements
-
使用列别名返回变量
Returning Nodes
可以使用 RETURN 子句返回节点。
Example
在继续执行示例之前,请创建 3 个节点和 2 个关系,如下所示。
Create (Dhoni:player {name: "MahendraSingh Dhoni", YOB: 1981, POB: "Ranchi"})
CREATE (Ind:Country {name: "India", result: "Winners"})
CREATE (CT2013:Tornament {name: "ICC Champions Trophy 2013"})
CREATE (Ind)-[r1:WINNERS_OF {NRR:0.938 ,pts:6}]->(CT2013)
CREATE(Dhoni)-[r2:CAPTAIN_OF]->(Ind)
以下是创建一个名为 Dhoni 的节点并返回它的 Cypher 查询示例。
Create (Dhoni:player {name: "MahendraSingh Dhoni", YOB: 1981, POB: "Ranchi"})
RETURN Dhoni
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Returning Multiple Nodes
您还可以使用 return 子句返回多个节点。
Syntax
以下是使用 return 子句返回多个节点的语法。
CREATE (Ind:Country {name: "India", result: "Winners"})
CREATE (CT2013:Tornament {name: "ICC Champions Trophy 2013"})
RETURN Ind, CT2013
Example
以下是使用 return 子句返回多个节点的 Cypher 查询示例。
CREATE (Ind:Country {name: "India", result: "Winners"})
CREATE (CT2013:Tornament {name: "ICC Champions Trophy 2013"})
RETURN Ind, CT2013
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Returning Relationships
您还可以使用 Return 子句返回关系。
Syntax
以下是使用 RETURN 子句返回关系的语法。
CREATE (node1)-[Relationship:Relationship_type]->(node2)
RETURN Relationship
Example
以下是一个创建两个关系并返回它们的 Cypher 查询示例。
CREATE (Ind)-[r1:WINNERS_OF {NRR:0.938 ,pts:6}]->(CT2013)
CREATE(Dhoni)-[r2:CAPTAIN_OF]->(Ind)
RETURN r1, r2
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Returning Properties
您还可以使用 RETURN 子句返回属性。
Syntax
以下是使用 RETURN 子句返回属性的语法。
Match (node:label {properties . . . . . . . . . . })
Return node.property
Example
以下是返回节点属性的 Cypher 查询示例。
Match (Dhoni:player {name: "MahendraSingh Dhoni", YOB: 1981, POB: "Ranchi"})
Return Dhoni.name, Dhoni.POB
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Returning All Elements
您可以使用 RETURN 子句返回 Neo4j 数据库中的所有元素。
Example
以下是返回数据库中所有元素的 Cypher 查询示例。
Match p = (n {name: "India", result: "Winners"})-[r]-(x)
RETURN *
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Returning a Variable With a Column Alias
您可以在 Neo4j 中使用 RETURN 子句使用别名返回特定列。
Example
以下是一个将 POB 列作为出生地的 Cypher 查询示例。
Match (Dhoni:player {name: "MahendraSingh Dhoni", YOB: 1981, POB: "Ranchi"})
Return Dhoni.POB as Place Of Birth
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Order By Clause
您可以使用 ORDER BY 子句按顺序排列结果数据。
Syntax
以下是 ORDER BY 从句的语法。
MATCH (n)
RETURN n.property1, n.property2 . . . . . . . .
ORDER BY n.property
Example
在继续举例之前,请按照以下指示在 Neo4j 数据库中创建 5 个节点。
CREATE(Dhawan:player{name:"shikar Dhawan", YOB: 1985, runs:363, country: "India"})
CREATE(Jonathan:player{name:"Jonathan Trott", YOB:1981, runs:229, country:"South Africa"})
CREATE(Sangakkara:player{name:"Kumar Sangakkara", YOB:1977, runs:222, country:"Srilanka"})
CREATE(Rohit:player{name:"Rohit Sharma", YOB: 1987, runs:177, country:"India"})
CREATE(Virat:player{name:"Virat Kohli", YOB: 1988, runs:176, country:"India"})
以下是一个使用 ORDERBY 子句按球员得分顺序返回上述创建节点的示例 Cypher 查询。
MATCH (n)
RETURN n.name, n.runs
ORDER BY n.runs
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Ordering Nodes by Multiple Properties
您可以使用 ORDEYBY 子句按多个属性整理节点。
Example
以下是一个示例 Cypher 查询,该查询按以下属性对本章前面创建的节点进行整理:得分和国家。
MATCH (n)
RETURN n.name, n.runs, n.country
ORDER BY n.runs, n.country
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Ordering Nodes by Descending Order
您可以使用 ORDERBY 子句按降序排列数据库中的节点。
Example
以下是一个示例 Cypher 查询,该查询使用 ORDERBY 子句按降序排列数据库中的节点。
MATCH (n)
RETURN n.name, n.runs
ORDER BY n.runs DESC
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Limit Clause
limit 子句用于限制输出中的行数。
Example
在继续举例之前,请按照以下指示在 Neo4j 数据库中创建 5 个节点。
CREATE(Dhawan:player{name:"shikar Dhawan", YOB: 1985, runs:363, country: "India"})
CREATE(Jonathan:player{name:"Jonathan Trott", YOB:1981, runs:229, country:"South Africa"})
CREATE(Sangakkara:player{name:"Kumar Sangakkara", YOB:1977, runs:222, country:"Srilanka"})
CREATE(Rohit:player{name:"Rohit Sharma", YOB: 1987, runs:177, country:"India"})
CREATE(Virat:player{name:"Virat Kohli", YOB: 1988, runs:176, country:"India"})
以下是一个示例 Cypher 查询,该查询按降序返回上述创建的节点,并将其结果中的记录限制为 3 个。
MATCH (n)
RETURN n.name, n.runs
ORDER BY n.runs DESC
LIMIT 3
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Limit with expression
您还可以对表达式使用 LIMIT 子句。
Example
以下是限制使用表达式记录的 Cypher 查询示例。
MATCH (n)
RETURN n.name, n.runs
ORDER BY n.runs DESC
LIMIT toInt(3 * rand())+ 1
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Skip Clause
SKIP 子句用于定义从哪一行开始包含输出中的行。
Example
在继续示例之前,请像下面一样创建 5 个节点。
CREATE(Dhawan:player{name:"shikar Dhawan", YOB: 1985, runs:363, country: "India"})
CREATE(Jonathan:player{name:"Jonathan Trott", YOB:1981, runs:229, country:"South Africa"})
CREATE(Sangakkara:player{name:"Kumar Sangakkara", YOB:1977, runs:222, country:"Srilanka"})
CREATE(Rohit:player{name:"Rohit Sharma", YOB: 1987, runs:177, country:"India"})
CREATE(Virat:player{name:"Virat Kohli", YOB: 1988, runs:176, country:"India"})
以下是返回数据库中跳过前 3 个节点的所有节点的 Cypher 查询示例。
MATCH (n)
RETURN n.name, n.runs
ORDER BY n.runs DESC
SKIP 3
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Skip Using Expression
你可以使用表达式跳过某个结果的记录。
Example
以下是使用 SKIP 子句和表达式的 Cypher 查询示例。
MATCH (n)
RETURN n.name, n.runs
ORDER BY n.runs DESC
SKIP toInt (2*rand())+ 1
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - With Clause
可以使用 WITH 子句将查询部分链接起来。
Example
以下是一个示例 Cypher 查询,演示了 WITH 子句的用法。
MATCH (n)
WITH n
ORDER BY n.name DESC LIMIT 3
RETURN collect(n.name)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Unwind Clause
unwind 子句用于将列表解压缩成序列行。
Example
以下是解压缩列表的 Cypher 查询示例。
UNWIND [a, b, c, d] AS x
RETURN x
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Aggregation Function
与 SQL 类似,Neo4j CQL 在 RETURN 子句中提供了一些聚合函数供使用。它类似于 SQL 中的 GROUP BY 子句。
我们可以在 MATCH 命令中使用这些 RETURN + 聚合函数对一组节点执行操作并返回一些聚合值。
Neo4j - Backup & Restore
在实时应用程序中,我们应该定期备份我们的应用程序数据库,这样我们可以在任何故障时恢复到工作状态。
此规则适用于 RDBMS 和 NoSQL 数据库。
在本节中,我们将讨论两项重要的 DBA 任务。
-
如何备份 Neo4j 数据库。
-
如何将 Neo4j 数据库还原到特定备份。
Note - 这些步骤仅适用于 Windows 操作系统。我们应该使用类似的命令在其他操作系统中执行相同的步骤。
Neo4j Database Backup
Step 1 - 使用以下路径单击“Neo4j Community” -
Windows “开始”按钮 → “所有程序” → “Neo4j Community” → “Neo4j Community”
默认情况下,它会选择 c:\Users\[username]\Documents\Neo4j\default.graphdb. 但如果我们愿意,我们可以将路径更改为不同的目录。
Step 2 - 在这里我们已经更改为我们的 Neo4j 数据库文件夹。
C:\Ne04j2.0db
Step 3 - 点击“开始”按钮。
服务器启动后,我们可以观察我们的 Neo4j 数据库文件是在指定目录中生成的。
在进行数据库备份之前,我们应该做的第一件也是最重要的事情是关闭 Neo4j 数据库服务器。
Step 4 - 点击“停止”按钮关闭服务器。
Neo4j 数据库文件可在 C:\Ne04j2.0db 中找到。
Step 5 - 打开命令提示符。
Step 6 − 在 C:\Neo4j 创建一个“Neo4jDbBackup-01”文件夹(此文件夹可以存在于文件系统中的任何位置)。
mkdir C:\Neo4j\Neo4jDbBackup-01
它会在指定的“C:\Neo4j\”文件系统位置创建新的“Neo4jDbBackup-01”文件夹。
Step 7 − 键入以下命令并按 Enter 键。
copy C:\Ne04j2.0db C:\Neo4j\Neo4jDbBackup-01
这意味着我们的文件已复制到所需的目标文件夹。访问该文件夹,并查看该文件夹是否包含我们的数据库文件。
Step 8 − 使用任何 Windows 压缩/解压工具,例如 WinZip、7 Zip 或 WinRAR 来压缩我们的数据库文件夹。
Step 9 − 现在已创建我们的 Neo4jDbBackup-01.zip 文件。如果文件系统中存在任何内存限制,请删除“C:\Neo4j\”中的“Neo4jDbBackup-01”文件夹。
Neo4j Database Restore
Step 1 − 关闭数据库服务器。请参阅前面的步骤以关闭服务器。
Step 2 − 清空当前数据库文件夹。
Step 3 − 使用任何 Windows 压缩/解压工具,例如 WinZip、7 Zip 或 WinRar 来解压我们的备份文件夹。
Step 4 − 打开命令提示符并执行以下命令。
Copy C:\Neo4j\Neo4jDbBackup-01 C:\Ne04j2.0db
现在我们可以看到我们的数据库文件夹包含正常工作的备份文件。
Step 5 − 通过单击“开始”按钮启动服务器。
Step 6 − 执行一些 MATCH + RETURN 命令以验证是否已正确还原了数据库。
Neo4j - Index
Neo4j SQL 支持节点或关系属性上的索引以提升应用程序性能。我们可以在具有相同标签名称的所有节点上为属性创建索引。
我们可以在 MATCH 或 WHERE 或 IN 运算符上使用这些索引列以提升 CQL 命令的执行。
在本章中,我们将讨论如何 −
-
Create an Index
-
Delete an Index
Creating an Index
Neo4j CQL 提供了“CREATE INDEX”命令在 Node 或 Relationship 属性上创建索引。
Example
在继续执行示例之前,创建节点 Dhawan,如下所示。
CREATE (Dhawan:player{name: "shikar Dhawan", YOB: 1995, POB: "Delhi"})
以下是 Cypher 查询示例,在 Neo4j 中为节点 Dhawan 创建索引。
CREATE INDEX ON:player(Dhawan)
执行上述查询,执行以下步骤:
Step 1 − 打开 Neo4j 桌面应用程序并启动 Neo4j 服务器。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用程序,如下所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Deleting an Index
Neo4j CQL 提供了“DROP INDEX”命令来删除 Node 或 Relationshis 属性的现有索引。
Example
以下是 Cypher 查询示例,在 Neo4j 中为名为“Dhawan”的节点创建索引。
DROP INDEX ON:player(Dhawan)
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Create Unique Constraint
在 Neo4j 数据库中,CQL CREATE 命令始终会创建新节点或关系,这意味着即使您使用相同的值,它也会插入新行。根据我们的应用程序要求的一些节点或关系,我们必须避免这种重复。为此,我们应使用一些数据库约束在节点或关系的一个或多个属性上创建规则。
与 SQL 类似,Neo4j 数据库还支持节点或关系属性上的 UNIQUE(唯一)约束。UNIQUE 约束用于避免重复记录并强制执行数据完整性规则。
Create UNIQUE Constraint
Neo4j CQL 提供“CREATE CONSTRAINT”命令,用于针对节点或关系属性创建唯一约束。
Syntax
以下是 Neo4j 中创建 UNIQUE 约束的语法。
MATCH (root {name: "Dhawan"})
CREATE UNIQUE (root)-[:LOVES]-(someone)
RETURN someone
Example
在继续示例之前,如以下所示创建 4 个节点。
CREATE(Dhawan:player{id:001, name: "shikar Dhawan", YOB: 1995, POB: "Delhi"})
CREATE(Jonathan:player {id:002, name: "Jonathan Trott", YOB: 1981, POB: "CapeTown"})
CREATE(Sangakkara:player {id:003, name: "Kumar Sangakkara", YOB: 1977, POB: "Matale"})
CREATE(Rohit:player {id:004, name: "Rohit Sharma", YOB: 1987, POB: "Nagpur"})
CREATE(Virat:player {id:005, name: "Virat Kohli", YOB: 1988, POB: "Delhi"})
以下是使用 Neo4j 根据 id 属性创建 UNIQUE 约束的 Cypher 查询示例。
CREATE CONSTRAINT ON (n:player) ASSERT n.id IS UNIQUE
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。
Neo4j - Drop Unique
我们在前一章中已经讨论了使用示例创建 UNIQUE 约束操作。在本章中,我们将讨论删除 UNIQUE 约束操作并提供示例。
Neo4j CQL 提供“DROP CONSTRAINT”命令,用于从节点或关系属性中删除现有的 Unique 约束。
Example
以下是删除属性 id 上的 UNIQUE 约束的 Cypher 查询示例。
DROP CONSTRAINT ON (n:player)
ASSERT n.id IS UNIQUE
执行上述查询,执行以下步骤:
Step 1 - 打开 Neo4j Desktop App 并启动 Neo4j Server。使用 URL http://localhost:7474/ 打开 Neo4j 的内置浏览器应用,如下面的屏幕截图所示。
Step 2 - 在美元提示符中复制并粘贴所需的查询,并按播放按钮(执行查询)突出显示在下面的屏幕截图中。