Neo4j图数据库遵循属性图模型来存储和管理其数据。
根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。
基于方向性,Neo4j关系被分为两种主要类型。
在以下场景中,我们可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。
在两个现有节点之间创建无属性的关系
在两个现有节点之间创建有属性的关系
在两个新节点之间创建无属性的关系
在两个新节点之间创建有属性的关系
在具有WHERE子句的两个退出节点之间创建/不使用属性的关系
注意 -
我们将创建客户和CreditCard之间的关系,如下所示:
在上一章中,我们已经创建了Customer和CreditCard节点。 现在我们将看到如何创建它们之间的关系
此图描述了客户与CreditCard之间的关系
客户→信用卡
这里的关系是箭头标记(→)
由于Neo4j CQL语法是以人类可读的格式。 Neo4j CQL也使用类似的箭头标记来创建两个节点之间的关系。
每个关系(→)包含两个节点
从上图中,Customer节点是“From Node”,CreditCard Node是“To Node”这种关系。
对于节点,它们是两种关系
从上图中,关系是到客户节点的“外向关系”,并且相同的关系是到信用卡节点的“到达关系”。
考虑下面的图。 这里我们创建了从“CreditCard”节点到“客户”节点的关系。
从上面的图中,关系是“出局关系”到“信用卡”节点,并且相同的关系是“到达关系”到“客户”节点。
考虑下面的图。 我们在“CreditCard”和“Customer”节点之间创建了两个关系:一个从“CreditCard”到“Customer”。 另一个从“客户”到“信用卡”。 这意味着它是双向关系。
Neo4j CQL创建节点标签
Label是Neo4j数据库中的节点或关系的名称或标识符。
我们可以将此标签名称称为关系为“关系类型”。
我们可以使用CQL CREATE命令为节点或关系创建单个标签,并为节点创建多个标签。 这意味着Neo4j仅支持两个节点之间的单个关系类型。
我们可以在UI模式和网格模式下在CQL数据浏览器中观察此节点或关系的标签名称。 并且我们引用它执行CQL命令。
到目前为止,我们只创建了一个节点或关系的标签,但我们没有讨论它的语法。
使用Neo4j CQL CREATE命令
为节点创建单个标签
为节点创建多个标签
为关系创建单个标签
我们将在本章中讨论如何创建一个节点的单个标签或多个标签。 我们将在下一章讨论如何为关系创建一个单独的标签。
语法:
CREATE (<node-name>:<label-name>)
我们应该使用colon(:)运算符来分隔节点名和标签名。
Neo4j数据库服务器使用此名称将此节点详细信息存储在Database.As Neo4j DBA或Developer中,我们不能使用它来访问节点详细信息
Neo4j数据库服务器创建一个标签名称作为内部节点名称的别名。作为Neo4j DBA或开发人员,我们应该使用此标签名称来访问节点详细信息。
例如:
本示例演示如何为“GooglePlusProfile”节点创建单个标签。
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
CREATE (google1:GooglePlusProfile)
这里google1是一个节点名
GooglePlusProfile是google1node的标签名称
步骤3 -点击“执行”按钮并观察结果。
我们可以观察到在Neo4j数据库中创建了一个标签和一个节点。
语法:
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
我们应该使用colon(:)运算符来分隔节点名和标签名。
我们应该使用colon(:)运算符将一个标签名称分隔到另一个标签名称。
例如:
本示例演示如何为“Cinema”节点创建多个标签名称。
我们的客户提供的多个标签名称:Cinema,Film,Movie,Picture。
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
CREATE (m:Movie:Cinema:Film:Picture)
这里m是一个节点名
Movie, Cinema, Film, Picture是m节点的多个标签名称
步骤3 -点击“执行”按钮并观察结果。
这里我们可以观察到在Neo4j数据库中创建了四个标签和一个节点。
语法:
CREATE (<node1-name>:<label1-name>)-
[<relationship-name>:<relationship-label-name>]
->(<node2-name>:<label2-name>)
我们应该使用colon(:)运算符来分隔节点名和标签名。
我们应该使用colon(:)运算符来分隔关系名称和关系标签名称。
我们应该使用colon(:)运算符将一个标签名称分隔到另一个标签名称。
Neo4J数据库服务器使用此名称将此节点详细信息存储在Database.As中作为Neo4J DBA或开发人员,我们不能使用它来访问节点详细信息。
Neo4J Database Server创建一个标签名称作为内部节点名称的别名。作为Neo4J DBA或Developer,我们应该使用此标签名称来访问节点详细信息。
例如:
本示例演示如何为关系创建标签
步骤1 -打开Neo4J数据浏览器
步骤2 -在数据浏览器上键入以下命令
CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2)
这里p1和profile1是节点名称和节点标签名称“From Node”
p2和Profile2是“To Node”的节点名称和节点标签名称
r1是关系名称
LIKES是一个关系标签名称
步骤3 -点击“执行”按钮并观察结果。
这里我们可以观察到两个节点,两个标签和一个关系被添加到Neo4J数据库。
像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。
简单WHERE子句语法
WHERE <condition>
复杂WHERE子句语法
WHERE <condition> <boolean-operator> <condition>
我们可以使用布尔运算符在同一命令上放置多个条件。 请参考下一节,了解Neo4j CQL中可用的布尔运算符。
<condition>语法:
<property-name> <comparison-operator> <value>
Neo4j支持以下布尔运算符在Neo4j CQL WHERE子句中使用以支持多个条件。
Neo4j CQL中的比较运算符
Neo4j 支持以下的比较运算符,在 Neo4j CQL WHERE 子句中使用来支持条件。
例如:
此示例演示如何在MATCH Command中使用CQL WHERE子句根据员工名称检索员工详细信息。
步骤1 -打开Neo4j数据浏览器
这是Neo4j数据浏览器主页
步骤2 -在数据浏览器上键入以下命令
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
步骤3 -点击“执行”按钮并观察结果。
如果我们观察结果,它返回4个员工节点详细信息。
步骤4 -在数据浏览器上键入以下命令
MATCH (emp:Employee)
WHERE emp.name = 'Abc'
RETURN emp
步骤5 -点击“执行”按钮并观察结果。
使用“网格视图”查看节点详细信息。如果我们观察结果,它只返回一个名为“Abc”的员工详细信息。
例如:
此示例演示如何在MATCH Command中的CQL WHERE子句中使用多个条件与布尔运算符,以根据员工名称检索员工详细信息。
步骤1 -打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
步骤3 -点击“执行”按钮并观察结果。
如果我们观察结果,它返回4个员工节点详细信息。
步骤4 -在数据浏览器上键入以下命令
MATCH (emp:Employee)
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp
使用“网格视图”查看节点详细信息。如果我们观察到结果,它只返回两个名为“Abc”或“Xyz”的员工详细信息。
在Neo4J CQL中,我们可以以不同的方式创建拖曳节点之间的关系。
创建两个现有节点之间的关系
一次创建两个节点和它们之间的关系
使用WHERE子句创建两个现有节点之间的关系
我们已经讨论了前两章中的前两种方法。 现在我们将在本章中讨论“使用WHERE子句创建两个现有节点之间的关系”。
语法
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
WHERE <condition>
CREATE (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
{<relationship-properties>}]->(<node2-label-name>)
语法说明:
例如:
此示例演示如何使用WHERE子句创建两个现有节点之间的关系。
步骤1 -打开Neo4J数据浏览器
步骤2 -在数据浏览器上键入以下命令,以验证我们的Neo4J数据库中是否存在所需的客户节点。
MATCH (cust:Customer)
RETURN cust.id,cust.name,cust.dob
步骤3 -点击“执行”按钮并观察结果。
如果我们观察结果,它表明我们所需的客户节点在我们的Neo4J数据库中可用。
步骤4 -在数据浏览器上键入以下命令,验证我们的Neo4J数据库中是否存在所需的CreditCard节点。
MATCH (cc:CreditCard)
RETURN cc.id,cc.number,cc.expiredate,cc.cvv
步骤5 -点击“执行”按钮并观察结果。
如果我们观察结果,它表明我们所需的CreditCard节点在我们的Neo4J数据库中可用。
步骤6 -在数据浏览器上键入以下命令以创建客户和CreditCard节点之间的关系。
MATCH (cust:Customer),(cc:CreditCard)
WHERE cust.id = "1001" AND cc.id= "5001"
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)
RETURN r
单击关系并在单独的窗口中观察其属性
现在我们通过使用Neo4J CQL WHERE子句在两个现有节点之间创建了一个NEW关系。
Neo4j使用CQL DELETE子句
我们将在本章中讨论如何删除一个节点。 我们将在下一章讨论如何删除节点和相关的节点和关系。
删除节点 -
通过使用此命令,我们可以从数据库永久删除节点及其关联的属性。
DELETE节点子句语法
DELETE <node-name-list>
我们应该使用逗号(,)运算符来分隔节点名。
例如:
此示例演示如何从数据库中永久删除节点。
步骤1 - 打开Neo4j数据浏览器。
步骤2 - 在数据浏览器上键入以下命令
MATCH (e: Employee) RETURN e
注意 -
MATCH (e: 'Employee') RETURN e
MATCH (e: "Employee") RETURN e
MATCH (e: Employee) RETURN e
所有三个命令都相同,我们可以选择这些命令中的任何一个。
步骤3 - 点击“执行”按钮并观察结果
这里我们可以观察到在数据库中有一个节点可用“Employee”名称。
步骤4 - 在数据浏览器上键入以下命令。
MATCH (e: Employee) DELETE e
现在,而不是“返回e”,使用“DELETE e”命令删除Employee节点
步骤5 - 单击“执行”按钮并观察结果。
现在检查是否从数据库中删除Employee节点。
步骤6 - 键入以下命令,然后单击执行命令。
MATCH (e: Employee) RETURN e
在这里我们可以观察到Employee节点被永久删除为零查询返回的行。
DELETE <node1-name>,<node2-name>,<relationship-name>
我们应该使用逗号(,)运算符来分隔节点名称和关系名称。
例如:
此示例演示如何从数据库永久删除节点及其关联节点和关系。
步骤1 - 打开Neo4j数据浏览器
步骤2 - 在数据浏览器上键入以下命令
MATCH (cc:CreditCard)-[r]-(c:Customer)RETURN r
在这里我们观察到一个节点为客户,一个节点为信用卡和它们之间的关系是可用的。
步骤4 - 在数据浏览器上键入以下命令
MATCH (cc: CreditCard)-[rel]-(c:Customer)
DELETE cc,c,rel
步骤5 - 点击“执行”按钮并观察结果。
这里我们可以观察到两个节点及其关联的10个关系被成功删除。
现在检查DELETE操作是否成功完成。
步骤6 - 在数据浏览器上键入以下命令。
MATCH (cc:CreditCard)-[r]-(c:Customer) RETURN r
步骤7 - 点击“执行”按钮并观察结果。
这里我们可以看到从数据库返回的零行。
有时基于我们的客户端要求,我们需要向现有节点或关系添加或删除属性。
我们使用Neo4j CQL SET子句向现有节点或关系添加新属性。
我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。
Neo4j CQL REMOVE命令用于
Neo4j CQL DELETE和REMOVE命令之间的主要区别 -
Neo4j CQL DELETE和REMOVE命令之间的相似性 -
我们可以使用相同的语法从数据库中永久删除节点或关系的属性或属性列表。
REMOVE属性子句语法
REMOVE <property-name-list>
property-name-list <属性名称列表>语法
<node-name>.<property1-name>,
<node-name>.<property2-name>,
....
<node-name>.<propertyn-name>
注意 -
我们应该使用逗号(,)运算符来分隔标签名称列表。
我们应该使用dot(。)运算符来分隔节点名称和标签名称。
例如:
此示例演示如何创建节点并从数据库中永久删除此节点的属性。
步骤1 - 打开Neo4j数据浏览器
步骤2 -在数据浏览器上键入以下命令
CREATE (book:Book {id:122,title:"Neo4j Tutorial",pages:340,price:250})
步骤3 -点击“执行”按钮并观察结果。
它类似于以下两个SQL命令在一个镜头。
CREATE TABLE BOOK(
id number,
title varchar2(20),
pages number,
price number
);
INSERT INTO BOOK VALUES (122,'Neo4j Tutorial',340,250);
这里我们可以观察到一个标签和一个节点有4个属性被成功创建。
步骤4 -在数据浏览器上键入以下命令
MATCH (book : Book)
RETURN book
它类似于下面的SQL命令。
SELECT * FROM BOOK;
步骤5 -点击“执行”按钮并观察结果。
这里我们可以观察到这个书节点有4个属性。
步骤6 -在数据浏览器上键入以下命令,然后单击执行按钮从书节点中删除“price”属性。
MATCH (book { id:122 })
REMOVE book.price
RETURN book
它类似于下面的SQL命令。
ALTER TABLE BOOK REMOVE COLUMN PRICE;
SELECT * FROM BOOK WHERE ID = 122;
在这里,我们只能看到节点书的3个属性,因为“价格”属性被删除。
有时基于客户端要求,我们需要删除一些现有的属性到节点或关系。
我们需要使用REMOVE子句来删除一个属性或一组属性。
例如
此示例演示如何从数据库中永久删除现有节点的属性。
步骤1 - 打开Neo4j数据浏览器
步骤2 - 在数据浏览器上键入以下命令
MATCH (dc:DebitCard)
RETURN dc
步骤3 -点击“执行”按钮并观察结果。
这里我们可以观察到DebitCard节点包含6个属性。
步骤4 -在数据浏览器上键入以下命令
MATCH (dc:DebitCard)
REMOVE dc.cvv
RETURN dc
步骤5 -点击“执行”按钮并观察结果。
如果我们观察输出,“cvv”属性从“DebitCard”节点中删除。
我们可以使用相同的语法从数据库中永久删除节点或关系的标签或标签列表。
REMOVE一个Label子句语法:
REMOVE <label-name-list>
<node-name>:<label2-name>,
....
<node-name>:<labeln-name>
我们应该使用逗号(,)运算符来分隔标签名称列表。
我们应该使用colon(:)运算符来分隔节点名和标签名。
例如:
此示例演示如何从数据库永久删除不需要的标签到节点。
步骤1 - 打开Neo4j数据浏览器
步骤2 - 在数据浏览器上键入以下命令
MATCH (m:Movie) RETURN m
步骤3 -点击“执行”按钮并观察结果。
步骤4 -点击节点以查看其属性窗口。
在这里我们可以观察到四个标签可用于单个节点。
根据我们的客户要求,我们需要删除“图片”属性到此节点。
步骤5 -在浏览器上键入以下命令,然后单击执行按钮。
MATCH (m:Movie)
REMOVE m:Picture
步骤6 -点击“执行”按钮并观察结果。
在这里我们可以观察到一个标签从数据库永久删除的节点。
步骤7 -在数据浏览器上键入以下命令
MATCH (m:Movie) RETURN m
步骤8 -点击“执行”按钮并观察结果
步骤9 -单击节点以查看其属性窗口。
这里我们可以观察到这个节点只有三个标签:Movie,Cinema,Film from Properties Window。 这意味着我们的上一个命令已成功删除图片标签。
有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。
要做到这一点,Neo4j CQL 提供了一个SET子句。
Neo4j CQL 已提供 SET 子句来执行以下操作。
SET子句语法
SET <property-name-list>
<属性名称列表>语法:
<node-label-name>.<property1-name>,
<node-label-name>.<property2-name>,
....
<node-label-name>.<propertyn-name>
我们应该使用逗号(,)运算符来分隔属性名列表。
示例:演示如何向现有 DebitCard 节点添加新属性。
步骤1 -打开 Neo4j 数据浏览器
步骤2 -在数据浏览器上键入以下命令
MATCH (book:Book)
RETURN book
MATCH (book:Book)
SET book.title = 'superstar'
RETURN book