Nosql-图数据库-CQL简介

2022-09-07  本文已影响0人  Viterbi

CQL简介

CQL代表Cypher查询语言。 像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。

Neo4j CQL -

如Oracle SQL -

Neo4j CQL命令

CQL命令 用法
CREATE 创建 创建节点,关系和属性
MATCH 匹配 检索有关节点,关系和属性数据
RETURN 返回 返回查询结果
WHERE 哪里 提供条件过滤检索数据
DELETE 删除 删除节点和关系
REMOVE 移除 删除节点和关系的属性
ORDER BY 以…排序排序检索数据
SET 组 添加或更新标签

Neo4j CQL 函数

定制列表功能 用法
String 字符串 它们用于使用String字面量。
Aggregation 聚合 它们用于对CQL查询结果执行一些聚合操作。
Relationship 关系 他们用于获取关系的细节,如startnode,endnode等。

Neo4j CQL数据类型

CQL数据类型 用法
boolean 用于表示布尔文字:true,false。
byte 用于表示8位整数。
short 用于表示16位整数。
int 用于表示32位整数。
long 用于表示64位整数。
float I用于表示32位浮点数。
double 用于表示64位浮点数。
char 用于表示16位字符。
String 用于表示字符串。

Neo4j CQL - CREATE命令

创建没有属性的节点

Neo4j CQL“CREATE”命令用于创建没有属性的节点。 它只是创建一个没有 任何数据的节点。

CREATE命令语法
CREATE (<node-name>:<label-name>)

语法说明

语法元素 描述
CREATE 它是一个Neo4j CQL命令。
它是我们要创建的节点名称
它是一个节点标签名称

注意事项

例如:本示例演示如何创建一个简单的“Employee”节点。 按照以下步骤:

使用属性创建节点

Neo4j CQL“CREATE”命令用于创建带有属性的节点。 它创建一个具有一些属性(键值对)的节点来存储数据

CREATE命令语法

CREATE (
   <node-name>:<label-name>
   { 	
      <Property1-name>:<Property1-Value>
      ........
      <Propertyn-name>:<Propertyn-Value>
   }
)

语法说明

语法元素 描述
它是我们将要创建的节点名称。
它是一个节点标签名称
属性是键值对。 定义将分配给创建节点的属性的名称
属性是键值对。 定义将分配给创建节点的属性的值

例如:此示例演示如何创建具有一些属性(deptno,dname,位置)的Dept节点。 按照下面给出的步骤

Neo4j CQL - MATCH命令

Neo4j CQL MATCH命令用于 -

MATCH命令语法

MATCH 
(
   <node-name>:<label-name>
)

语法说明

语法元素 描述
这是我们要创建一个节点名称。
这是一个节点的标签名称

注意事项 -

注意-我们不能单独使用MATCH Command从数据库检索数据。 如果我们单独使用它,那么我们将InvalidSyntax错误。
我们可以使用MATCH命令与RETURN子句或更新子句

Neo4j CQL - RETURN子句

Neo4j CQL RETURN子句用于 -

RETURN命令语法

RETURN 
   <node-name>.<property1-name>,
   ........
   <node-name>.<propertyn-name>

语法说明:

语法元素 描述
它是我们将要创建的节点名称
属性是键值对。定义要分配给创建节点的属性的名称

Neo4j CQL - MATCH & RETURN匹配和返回

在Neo4j CQL中,我们不能单独使用MATCH或RETURN命令,因此我们应该合并这两个命令以从数据库检索数据

Neo4j使用CQL MATCH + RETURN命令 -

MATCH RETURN命令语法:
MATCH Command
RETURN Command

例如: 本示例演示如何从数据库检索Dept节点的一些属性(deptno,dname)数据。

注-结点包含3个属性:deptno,dname,location。 然而在这个例子中,我们感兴趣的是只查看两个属性数据。 按照下面给出的步骤 -

MATCH (dept: Dept)
RETURN dept.deptno,dept.dname

这里 -

例如: 此示例演示如何从数据库检索Dept节点的数据,而无需指定其属性。

注-结点包含3个属性:deptno,dname,location。 按照下面给出的步骤 -

MATCH (dept: Dept)
RETURN dept

这里dept是一个节点名 这里Dept是一个节点标签名

Neo4j CQL - 关系基础

Neo4j图数据库遵循属性图模型来存储和管理其数据。

根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。

基于方向性,Neo4j关系被分为两种主要类型。

在以下场景中,我们可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。

例如:
我们将创建客户和CreditCard之间的关系,如下所示:
在上一章中,我们已经创建了Customer和CreditCard节点。 现在我们将看到如何创建它们之间的关系

此图描述了客户与CreditCard之间的关系

客户→信用卡
这里的关系是箭头标记(→)

由于Neo4j CQL语法是以人类可读的格式。 Neo4j CQL也使用类似的箭头标记来创建两个节点之间的关系。

每个关系(→)包含两个节点

从上图中,Customer节点是“From Node”,CreditCard Node是“To Node”这种关系

对于节点,它们是两种关系

从上图中,关系是到客户节点的“外向关系”,并且相同的关系是到信用卡节点的“到达关系”

Neo4j-没有属性的关系与现有节点

在这种情况下,我们将使用两个现有节点:CreditCard和Customer创建没有属性的关系。 这意味着,我们的Neo4J数据库应该有这两个节点。

我们使用CQL MATCH命令检索现有的两个节点和CQL CREATE命令,以创建它们之间的新关系。

语法:

MATCH (<node1-name>:<node1-label-name>),(<node2-name>:<node2-label-name>)
CREATE  
	(<node1-name>)-[<relationship-name>:<relationship-label-name>]->(<node2-name>)
RETURN <relationship-name>

语法说明:

语法元素 描述
MATCH,CREATE,RETURN 他们是Neo4J CQL关键字。
它用于创建关系的“From Node”的名称。
它用于创建关系的“From Node”的标签名称。
它用于创建关系的“To Node”的名称。
它用于创建关系的“To Node”的标签名称。
这是一个关系的名称。
它是一个关系的标签名称。

注意: 在此语法中,RETURN子句是可选的。 如果我们想立即看到结果,那么使用它。 否则,我们可以省略这个子句。

例如: 此示例演示如何在两个现有节点之间创建无属性的单向关系:从客户到信用卡。

MATCH (e:Customer) 
RETURN e
MATCH (cc:CreditCard) 
RETURN cc

MATCH (e:Customer),(cc:CreditCard) 
CREATE (e)-[r:DO_SHOPPING_WITH ]->(cc) 

这里关系标签为“DO_SHOPPING_WITH”

关系名为“r”。

shopdate和price是关系“r”的属性。

Neo4j-与现有节点的属性的关系

语法:

MATCH (<node1-name>:<node1-label-name>),(<node2-name>:<node2-label-name>)
CREATE  
        (<node1-name>)-[<relationship-name>:<relationship-label-name>
{<define-properties-list>}]->(<node2-name>)
RETURN <relationship-name>

注意 - 在此语法中,RETURN子句是可选的。 如果我们想立即看到结果,那么使用它。 否则,我们可以省略这个子句。

我们可以表示这{}如下。

语法 -

{ 
   <property1-name>:<property1-value>,
   <property2-name>:<property2-value>,
   ...
   <propertyn-name>:<propertyn-value>
}

在数据浏览器上键入以下命令

MATCH (cust:Customer),(cc:CreditCard) 
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc) 
RETURN r

Neo4j-新节点无属性关系

在这种情况下,我们将一次创建两个没有属性的节点和关系。 这意味着,我们的Neo4J数据库没有这两个节点。

我们使用CQL CREATE命令一次创建两个结束节点和它们之间的新关系。

语法:

CREATE  
   (<node1-name>:<node1-label-name>)-
   [<relationship-name>:<relationship-label-name>]->
   (<node1-name>:<node1-label-name>)
RETURN <relationship-name>

Neo4j-新节点与属性的关系

在这种情况下,我们将一次创建两个节点和关系属性。 这意味着,我们的Neo4J数据库没有这两个节点。

我们使用CQL CREATE命令一次创建两个结束节点和它们之间的新关系。

语法:

CREATE  
	(<node1-name>:<node1-label-name>{<define-properties-list>})-
	[<relationship-name>:<relationship-label-name>{<define-properties-list>}]
	->(<node1-name>:<node1-label-name>{<define-properties-list>})
RETURN <relationship-name>

Neo4j-检索关系节点的详细信息

我们可以使用MATCH + RETURN命令来查看单独创建或作为关系的一部分创建的节点的详细信息。

在本章中,我们将讨论如何检索参与关系的Node的详细信息。

语法:

MATCH 
(<node1-name>)-[<relationship-name>:<relationship-label-name>]->(<node2-name>)
RETURN <relationship-name>

Neo4j CQL - CREATE创建标签

Neo4j CQL创建节点标签 Label是Neo4j数据库中的节点或关系的名称或标识符。

我们可以将此标签名称称为关系为“关系类型”。
我们可以使用CQL CREATE命令为节点或关系创建单个标签,并为节点创建多个标签。 这意味着Neo4j仅支持两个节点之间的单个关系类型。 我们可以在UI模式和网格模式下在CQL数据浏览器中观察此节点或关系的标签名称。 并且我们引用它执行CQL命令。

到目前为止,我们只创建了一个节点或关系的标签,但我们没有讨论它的语法。

使用Neo4j CQL CREATE命令

我们将在本章中讨论如何创建一个节点的单个标签或多个标签。 我们将在下一章讨论如何为关系创建一个单独的标签。

单个标签到节点

语法:CREATE (<node-name>:<label-name>)

多个标签到节点

语法:CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)

单个标签到关系

语法:CREATE (<node1-name>:<label1-name>)- [(<relationship-name>:<relationship-label-name>)] ->(<node2-name>:<label2-name>)

Neo4j CQL - WHERE子句

像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。

WHERE <condition>
WHERE <condition> <boolean-operator> <condition>

我们可以使用布尔运算符在同一命令上放置多个条件。 请参考下一节,了解Neo4j CQL中可用的布尔运算符。

语法:

<property-name> <comparison-operator> <value>
语法元素 描述
WHERE 它是一个Neo4j CQL关键字。
<属性名称> 它是节点或关系的属性名称。
<比较运算符> 它是Neo4j CQL比较运算符之一。请参考下一节查看Neo4j CQL中可用的比较运算符。
<值> 它是一个字面值,如数字文字,字符串文字等。

Neo4j CQL中的布尔运算符

Neo4j支持以下布尔运算符在Neo4j CQL WHERE子句中使用以支持多个条件。

布尔运算符 描述
AND 它是一个支持AND操作的Neo4j CQL关键字。
OR 它是一个Neo4j CQL关键字来支持OR操作。
NOT 它是一个Neo4j CQL关键字支持NOT操作。
XOR 它是一个支持XOR操作的Neo4j CQL关键字。

Neo4j CQL中的比较运算符

Neo4j 支持以下的比较运算符,在 Neo4j CQL WHERE 子句中使用来支持条件。

布尔运算符 描述
= 它是Neo4j CQL“等于”运算符。
<> 它是一个Neo4j CQL“不等于”运算符。
< 它是一个Neo4j CQL“小于”运算符。
> 它是一个Neo4j CQL“大于”运算符。
<= 它是一个Neo4j CQL“小于或等于”运算符。
>= 它是一个Neo4j CQL“大于或等于”运算符

使用WHERE子句创建关系 在Neo4J CQL中,我们可以以不同的方式创建拖曳节点之间的关系。

使用WHERE子句创建关系

在Neo4J CQL中,我们可以以不同的方式创建拖曳节点之间的关系。

我们已经讨论了前两章中的前两种方法。 现在我们将在本章中讨论“使用WHERE子句创建两个现有节点之间的关系”。

语法

MATCH (<node1-name>:<node1-label-name>),(<node2-name>:<node2-label-name>) 
WHERE <condition>
CREATE (<node1-name>)-[<relationship-name>:<relationship-label-name>
       {<relationship-properties>}]->(<node2-name>) 

Neo4j CQL - DELETE删除

Neo4j CQL - DELETE删除 Neo4j使用CQL DELETE子句

我们将在本章中讨论如何删除一个节点。 我们将在下一章讨论如何删除节点和相关的节点和关系。

删除节点 -

通过使用此命令,我们可以从数据库永久删除节点及其关联的属性。

DELETE节点子句语法
DELETE <node-name-list>

DELETE节点和关系子句语法

DELETE <node1-name>,<node2-name>,<relationship-name>

Neo4j CQL - REMOVE删除

有时基于我们的客户端要求,我们需要向现有节点或关系添加或删除属性。

Neo4j CQL REMOVE命令用于

Neo4j CQL DELETE和REMOVE命令之间的主要区别 -

Neo4j CQL DELETE和REMOVE命令之间的相似性 -

删除节点/关系的属性

我们可以使用相同的语法从数据库中永久删除节点或关系的属性或属性列表。

REMOVE属性子句语法
REMOVE <property-name-list>

删除节点/关系的标签

我们可以使用相同的语法从数据库中永久删除节点或关系的标签或标签列表。
REMOVE一个Label子句语法:
REMOVE <label-name-list>

Neo4j CQL - SET子句

有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。

要做到这一点,Neo4j CQL提供了一个SET子句。

Neo4j CQL已提供SET子句来执行以下操作。

SET子句语法
SET <property-name-list>

Neo4j CQL - Sorting排序

Neo4j CQL ORDER BY子句 Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。

我们可以按升序或降序对行进行排序。

默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句

ORDER BY子句语法
ORDER BY <property-name-list> [DESC]

Neo4j CQL - UNION联盟

与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果

UNION子句

它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。

限制: 结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。

UNION子句语法

<MATCH Command1>
   UNION
<MATCH Command2>

例子:


MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
   cc.valid_from as valid_from,cc.valid_to as valid_to
UNION
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
   dc.valid_from as valid_from,dc.valid_to as valid_to

UNION ALL子句

它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。

限制 结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。

UNION ALL子句语法

<MATCH Command1>
UNION ALL
<MATCH Command2>

例子


MATCH (cc:CreditCard)
RETURN cc.id as id,cc.number as number,cc.name as name,
   cc.valid_from as valid_from,cc.valid_to as valid_to
UNION ALL
MATCH (dc:DebitCard)
RETURN dc.id as id,dc.number as number,dc.name as name,
   dc.valid_from as valid_from,dc.valid_to as valid_to

Neo4j CQL - LIMIT和SKIP子句

Neo4j CQL LIMIT子句

Neo4j CQL已提供“LIMIT”子句来过滤或限制查询返回的行数。 它修剪CQL查询结果集底部的结果。

如果我们要修整CQL查询结果集顶部的结果,那么我们应该使用CQL SKIP子句。 请参考本章的下一节CQL SKIP子句。

LIMIT子句语法
LIMIT <number>

Neo4j CQL SKIP子句

Neo4j CQL已提供“SKIP”子句来过滤或限制查询返回的行数。 它修整了CQL查询结果集顶部的结果。

如果我们要从CQL查询结果集底部修整结果,那么我们应该使用CQL LIMIT子句。 请参阅本章的上一节CQL LIMIT子句。

SKIP子句语法:
SKIP <number>

Neo4j CQL - 合并

Neo4j使用CQL MERGE命令 -

MERGE命令是CREATE命令和MATCH命令的组合。

MERGE = CREATE + MATCH
Neo4j CQL MERGE命令在图中搜索给定模式,如果存在,则返回结果 如果它不存在于图中,则它创建新的节点/关系并返回结果。

Neo4j CQL MERGE语法

MERGE (<node-name>:<label-name>
{
   <Property1-name>:<Pro<rty1-Value>
   .....
   <Propertyn-name>:<Propertyn-Value>
})

Neo4j CQL - NULL值

Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。

当我们创建一个具有现有节点标签名称但未指定其属性值的节点时,它将创建一个具有NULL属性值的新节点。

让我们用一个例子来看这个。

MATCH (e:Employee) 
WHERE e.id IS NOT NULL
RETURN e.id,e.name,e.sal,e.deptno


MATCH (e:Employee) 
WHERE e.id IS NULL
RETURN e.id,e.name,e.sal,e.deptno

Neo4j CQL-IN操作符

与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。
IN操作符语法IN[<Collection-of-values>]


MATCH (e:Employee) 
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno

Neo4j - ID属性

在Neo4j中,“Id”是节点和关系的默认内部属性。 这意味着,当我们创建一个新的节点或关系时,Neo4j数据库服务器将为内部使用分配一个数字。 它会自动递增。我们将通过一个例子来理解这个概念

注意 -

Neo4j - 方向关系

在Neo4j中,两个节点之间的关系是有方向性的。 它们是单向或双向的。

由于Neo4j遵循属性图数据模型,它应该只支持方向关系。 如果我们尝试创建一个没有任何方向的关系,那么Neo4j DB服务器应该抛出一个错误。

在本章中,我们将提供一个例子来证明这一点。

我们使用以下语法来创建两个节点之间的关系。

这里 -

relationship-details>是关系详细信息

如果我们观察上面的语法,它使用一个箭头标记:() - []→()。 它表示从左侧节点到右侧节点的方向。

如果我们尝试使用相同的语法,没有箭头标记like() - [] - (),这意味着没有方向的关系。 然后Neo4j DB服务器应该抛出一个错误消息

节点和标签之间关系

Neo4j中的节点标签,基本等同于关系数据库中的table表名,或者说是一个类别。但是跟table不同的是,这里节点很方便的有多个标签: (n:Person :User)

官方文档:
A label is a named graph construct that is used to group nodes into sets; all nodes labeled with the same label belongs to the same set。

问题中的CREATE (p:学生{name:"小红"})中的p只是在这个命令中的一个变量而已,命令执行完了之后,就没用了,所以后续就无法用它访问节点了。而可以用label做match访问。

create(:程序员 {name:"小东",age:23,birthday:"1995/12/06"})
>>Added 1 label, created 1 node, set 3 properties, completed after 21 ms.

本文使用 文章同步助手 同步

上一篇 下一篇

猜你喜欢

热点阅读