Neo4j - CQL语法介绍(3)
一、ORDER BY排序
Neo4j CQL ORDER BY子句
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。
我们可以按升序或降序对行进行排序。
默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句。
ORDER BY子句语法
ORDER BY <property-name-list> [DESC]
property-name-list语法:
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>
语法说明:
注意 -
我们应该使用逗号(,)运算符来分隔属性名列表。
例如:
此示例演示如何按照升序排序“员工名称”结果。
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
步骤3 -点击“执行”按钮并观察结果。
它返回数据库中可用的结果的总数:4条记录
步骤4 -输入在数据浏览器下面的命令
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name
步骤5 -点击“执行”按钮并观察结果。
如果我们观察结果,现在按照Employee.name按升序排序记录。
例如:
此示例演示如何按照员工名称按降序使用排序结果。
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
步骤3 -点击“执行”按钮并观察结果。
它返回数据库中可用的结果的总数:4条记录
步骤4 - 在数据浏览器上键入以下命令
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name DESC
第5步-点击“执行”按钮并观察结果。
如果我们观察结果,现在记录按照Employee.name按降序排序。
二、UNION合并
与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
- UNION
- UNION ALL
UNION子句
它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。
限制:
结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
UNION子句语法
<MATCH Command1>
UNION
<MATCH Command2>
语法说明:
注意 -
如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。
在本章中,我们将采取一个银行应用程序的节点:信用卡式和借记卡解释UNION子句
信用卡式节点数据
第1步 -打开Neo4j的数据浏览器
第2步 -在数据浏览器的美元提示符处键入以下命令。
MATCH (cc:CreditCard) RETURN cc
借记卡数据的节点
第1步 -打开Neo4j的数据浏览器
第2步 -在数据浏览器的美元提示符处键入以下命令。
MATCH (dc:DebitCard) RETURN dc
本例说明:如果UNION子句的这两个查询确实有相同的名称或相同的数据类型及其列会发生什么。
第1步 -打开Neo4j的数据浏览器
第2步 -在数据浏览器的美元提示符处键入以下命令。
MATCH (cc:CreditCard) RETURN cc.id,cc.number
UNION
MATCH (dc:DebitCard) RETURN dc.id,dc.number
第3步 -点击执行按钮,看到成功消息数据浏览器。
这表明,这两个查询应具有相同的列名。
首先查询有:cc.id,cc.number。
第二个查询有:dc.id,dc.number。
这里既有信用卡式和借记卡具有相同的属性名:身份证和号码,但他们有不同的节点名称前缀。这就是为什么UNION命令显示此错误消息。为了避免这种错误,Neo4j的CQL提供“AS”子句。
像CQL,CQL Neo4j的“AS”子句用于给一些别名。
此示例演示如何使用UNION子句从两个节点检索数据。
第1步 -打开Neo4j的数据浏览器
第2步 -在数据浏览器的美元提示符处键入以下命令,然后单击执行按钮。
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子句过滤它们,我们可以看到该命令返回9行没有重复的行。
UNION ALL子句
它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。
限制
结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。
UNION ALL子句语法
<MATCH Command1>
UNION ALL
<MATCH Command2>
语法说明
注意 -
如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。
在本章中,我们将采取一个银行应用程序的节点:信用卡式和借记卡解释UNION子句
信用卡式节点数据
第1步 -打开Neo4j的数据浏览器
第2步 -在数据浏览器的美元提示符处键入以下命令。
MATCH (cc:CreditCard) RETURN cc
借记卡数据的节点
第1步 -打开Neo4j的数据浏览器
第2步 -在数据浏览器的美元提示符处键入以下命令。
MATCH (dc:DebitCard) RETURN dc
本例说明:如果UNION子句的这两个查询确实有相同的名称或相同的数据类型及其列会发生什么。
第1步 -打开Neo4j的数据浏览器
这是Neo4j的数据浏览器首页
第2步 -在数据浏览器的美元提示符处键入以下命令。
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
第3步 -点击执行按钮,看到成功消息数据浏览器。
在这里,我们可以观察到这个命令返回10行,因为与UNION ALL子句不过滤它们重复行。如果我们使用UNION子句,它将返回只有9行。详情请参阅UNION子句章节进行检查。
三、LIMIT和SKIP子句
Neo4j CQL LIMIT子句
Neo4j CQL已提供“LIMIT”子句来过滤或限制查询返回的行数。 它修剪CQL查询结果集底部的结果。
如果我们要修整CQL查询结果集顶部的结果,那么我们应该使用CQL SKIP子句。 请参考本章的下一节CQL SKIP子句。
LIMIT子句语法
LIMIT <number>
语法说明:
例如:
本示例演示如何使用CQL LIMIT子句减少MATCH + RETURN查询返回的记录数。
步骤1 -打开Neo4j数据浏览器
它是Neo4j数据浏览器主页
步骤2 -在没有LIMIT子句的数据浏览器上键入以下命令
MATCH (emp:Employee)
RETURN emp
步骤3 -点击“执行”按钮并观察结果。
它返回数据库中可用的结果的总数:4条记录
步骤4 -使用LIMIT子句在数据浏览器上键入以下命令
MATCH (emp:Employee)
RETURN emp
LIMIT 2
步骤5 -点击“执行”按钮并观察结果。
它只返回Top的两个结果,因为我们定义了limit = 2。这意味着前两行。
Neo4j CQL SKIP子句
Neo4j CQL已提供“SKIP”子句来过滤或限制查询返回的行数。 它修整了CQL查询结果集顶部的结果。
如果我们要从CQL查询结果集底部修整结果,那么我们应该使用CQL LIMIT子句。 请参阅本章的上一节CQL LIMIT子句。
SKIP子句语法:
SKIP <number>
语法说明:
例如:
此示例演示如何使用CQL SKIP子句减少MATCH + RETURN查询返回的记录数。
步骤1 -打开Neo4j数据浏览器
步骤2 -在没有SKIP子句的数据浏览器上键入以下命令
MATCH (emp:Employee)
RETURN emp
步骤3 -点击“执行”按钮并观察结果。
它返回数据库中可用的结果的总数:4条记录
步骤4 -在带有SKIP子句的数据浏览器上键入以下命令
MATCH (emp:Employee)
RETURN emp
SKIP 2
步骤5 -点击“执行”按钮并观察结果。
skip跳过两个节点,因此我们定义了skip = 2。这意味着最后两行。
四、合并
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 MERGE命令语法与CQL CREATE命令类似。
我们将使用这两个命令执行以下操作 -
-
创建具有一个属性的配置文件节点:Id,名称
-
创建具有相同属性的同一个Profile节点:Id,Name
-
检索所有Profile节点详细信息并观察结果
我们将使用CREATE命令执行这些操作
Neo4j CQL CREATE示例
此示例通过使用CREATE,MATCH和RETURN命令创建Google+个人资料,执行上述所有操作。
操作(1):创建具有属性:Id,Name的Profile节点
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
CREATE (gp1:GoogleProfile1 {Id: 201401, Name:"Apple"})
步骤3 -点击“执行”按钮并观察结果。
如果我们观察到成功消息,它已经向GoogleProfile1节点添加了两个属性。
操作(2):创建具有相同属性的同一个Profile节点:Id,Name。
步骤1 -打开Neo4j的数据浏览器
步骤2 -输入在数据浏览器下面的命令
CREATE (gp1:GoogleProfile1 {Id: 201401, Name:"Apple"})
步骤3 -点击“执行”按钮并观察结果。
如果我们观察到成功消息,它已经向GoogleProfile1节点添加了两个属性。
操作(3):检索所有Profile节点详细信息并观察结果。
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
MATCH (gp1:GoogleProfile1)
RETURN gp1.Id,gp1.Name
步骤3 -点击“执行”按钮并观察结果。
如果我们观察到上面的查询结果,它显示2行重复的值。
CQL CREATE命令检查此节点是否可用,它只是在数据库中创建新节点。
通过观察这些结果,我们可以说CREATE命令总是向数据库添加新的节点。
Neo4j CQL MERGE示例
此示例通过使用MERGE和RETURN命令创建Google+个人资料,执行相同的上述操作。
操作(1):创建具有属性:Id,Name的Profile节点
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})
步骤3 -点击“执行”按钮并观察结果
如果我们观察到成功消息,它已经向GoogleProfile1节点添加了两个属性。
操作(2):创建具有相同属性的同一个Profile节点:Id,Name。
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
MERGE (gp2:GoogleProfile2{ Id: 201402,Name:"Nokia"})
步骤3 -点击“执行”按钮并观察结果。
如果我们观察到成功消息,它已经向GoogleProfile1节点添加了两个属性。
操作(3):检索所有Profile节点详细信息并观察结果
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
MATCH (gp2:GoogleProfile2)
RETURN gp2.Id,gp2.Name
步骤3 -点击“执行”按钮并观察结果。
如果我们观察上面的查询结果,它只显示一行,因为CQL MERGE命令检查该节点在数据库中是否可用。 如果它不存在,它创建新节点。 否则,它不创建新的。
通过观察这些结果,我们可以说,CQL MERGE命令将新的节点添加到数据库,只有当它不存在。
五、IN操作符
与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。
IN操作符语法
IN[<Collection-of-values>]
语法说明:
让我们用一个例子来研究一下。
例如:
此示例演示如何使用IN运算符检索Employee节点详细信息。
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器中的dollar提示符下键入以下命令。
MATCH (e:Employee)
RETURN e.id,e.name,e.sal,e.deptno
步骤3 -点击执行按钮,观察结果。
我们可以观察到这个查询返回4行。
步骤4 -键入以下命令,然后单击执行按钮。
MATCH (e:Employee)
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno
此查询仅返回在IN运算符中指定的id匹配的两行。