![]() |
追风的鼠标 · 安徽省司法厅办公室关于公布2023年度司法鉴 ...· 1 月前 · |
![]() |
豪气的炒饭 · KingbaseES ...· 3 月前 · |
![]() |
低调的绿茶 · 常见网络安全风险与应对· 4 月前 · |
![]() |
果断的汽水 · mongofiles - MongoDB ...· 5 月前 · |
![]() |
长情的人字拖 · Enhance Visual Appeal ...· 5 月前 · |
match 数据检索 命令模式 neo4j |
http://www.yishuifengxiao.com/2021/11/03/neo4j%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/ |
![]() |
不拘小节的黄花菜
5 月前 |
注意事项 :
1、Neo4j数据库服务器使用此
2、Neo4j数据库服务器创建一个
命令如下:
1 |
CREATE (emp:Employee) |
这里 emp 是一个节点名,Employee 是 emp 节点的标签名称
1 |
{ |
CREATE命令语法
1 |
CREATE ( |
创建具有一些属性(deptno,dname,位置)的Dept节点
1 |
CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" }) |
这里dept是一个节点名,Dept是dept节点的标签名称。这里的属性名称是deptno,dname,location属性值为10,”Accounting”,”Hyderabad” ,Property = deptno:10
因为deptno是一个整数属性,所以没有使用单引号或双引号定义其值10。
由于dname和location是String类型属性,因此使用单引号或双引号定义其值。
注意 - 要定义字符串类型属性值,需要使用单引号或双引号。
结果如下:
1 |
{ |
使用示例2
创建具有一些属性(id,name,sal,deptno)的Employee节点
1 |
CREATE (emp:Employee{id:123,name:"Lokesh",sal:35000,deptno:10}) |
这里emp是一个节点名。Employee是emp节点的标签名称
结果如下(包含2.1.1中创建的节点)
1 |
{ |
MATCH 命令语法:
1 |
MATCH |
注意- 不能单独使用 MATCH Command 从数据库检索数据。 如果单独使用它,那么将 InvalidSyntax 错误。
例如执行:
1 |
MATCH (dept:Dept) |
MATCH 经常需要与其他的语句配合才可以使用.
如:match (n) return n
1 |
# 查询Dept下的内容 |
RETURN命令语法:
1 |
RETURN |
语法说明:
*注意- 不能单独使用 RETURN Command 从数据库检索数据。 如果单独使用它,那么将 SyntaxError 错误。*
1 |
RETURN dept.deptno |
在Neo4j CQL中,不能单独使用MATCH或RETURN命令,因此应该合并这两个命令以从数据库检索数据。
Neo4j使用CQL MATCH + RETURN命令 -
1 |
MATCH Command |
语法说明:
本示例演示如何从数据库检索Dept节点的一些属性(deptno,dname)数据。
注- 结点包含3个属性:deptno,dname,location。 然而在这个例子中,感兴趣的是只查看两个属性数据。
命令如下:
1 |
MATCH (dept: Dept) |
运行结果如下:
此示例演示如何从数据库检索Dept节点的数据,而无需指定其属性。
注- 结点包含3个属性:deptno,dname,location。
命令如下:
1 |
MATCH (e:Employee) |
这里e是一个节点名,Employee是一个节点标签名
运行结果如下:
在Neo4j CQL中,不能单独使用MATCH或RETURN命令,因此应该结合这两个命令从数据库检索数据。
本示例演示如何使用属性和这两个节点之间的关系创建两个节点。
注- 将创建两个节点:客户节点 (Customer) 和信用卡节点 (CreditCard)。
将在以下步骤中处理此示例: -
创建客户节点
命令如下:
1 |
CREATE (e:Customer{id:"1001",name:"Abc",dob:"01/10/1982"}) |
参数解释如下:
创建CreditCard节点
命令如下:
1 |
CREATE (cc:CreditCard{id:"5001",number:"1234567890",cvv:"888",expiredate:"20/17"}) |
这里cc是一个节点名,CreditCard是节点标签名称; id,number,cvv和expiredate是CreditCard节点的属性名称
Neo4j图数据库遵循属性图模型来存储和管理其数据。
根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。
基于方向性,Neo4j关系被分为两种主要类型。
在以下场景中,可以使用Neo4j CQL CREATE命令来创建两个节点之间的关系。 这些情况适用于Uni和双向关系。
将创建客户和CreditCard之间的关系,如下所示:
此图描述了客户与CreditCard之间的关系
客户→信用卡 ,这里的关系是箭头标记(→)。由于Neo4j CQL语法是以人类可读的格式。 Neo4j CQL也使用类似的箭头标记来创建两个节点之间的关系。
每个关系(→)包含两个节点
从上图中,Customer节点是“From Node”,CreditCard Node是“To Node”这种关系。
对于节点,它们是两种关系
从上图中,关系是到客户节点的“外向关系”,并且相同的关系是到信用卡节点的“到达关系”。
考虑下面的图。 这里创建了从“CreditCard”节点到“客户”节点的关系。
从上面的图中,关系是“出局关系”到“信用卡”节点,并且相同的关系是“到达关系”到“客户”节点。
考虑下面的图。 在“CreditCard”和“Customer”节点之间创建了两个关系:一个从“CreditCard”到“Customer”。 另一个从“客户”到“信用卡”。 这意味着它是双向关系。
在这种情况下,将使用两个现有节点:CreditCard和Customer创建没有属性的关系。 这意味着,的Neo4J数据库应该有这两个节点。
使用CQL MATCH命令检索现有的两个节点和CQL CREATE命令,以创建它们之间的新关系。
1 |
MATCH (<node1-label-name>:<nodel-name>),(<node2-label-name>:<node2-name>) |
语法说明:
1 |
MATCH (e:Customer),(cc:CreditCard) |
这里关系名称为“DO_SHOPPING_WITH” , 关系标签为“r”。e和Customer分别是客户节点的节点名称和节点标签名称。cc和CreditCard分别是CreditCard节点的节点名和节点标签名。
执行成功后,再执行以下命令
1 |
MATCH (e)-[r:DO_SHOPPING_WITH ]->(cc) |
结果如下:
1 |
{ |
查看数据,可以看到:
在这种情况下,将使用两个现有节点:CreditCard和Customer创建与属性的关系。 这意味着,的Neo4J数据库应该有这两个节点。
使用CQL MATCH命令检索现有的两个节点和CQL CREATE命令,以创建它们之间的新关系。
1 |
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) |
语法说明:
可以表示这{}如下。
1 |
{ |
语法说明:
1 |
MATCH (cc:CreditCard) |
输入以下命令
1 |
MATCH (cust:Customer),(cc:CreditCard) |
参数解释如下:
由于使用RETURN子句,不需要单独的MATCH + RETRUN命令来查看详细信息。 它在UI模式下显示它们之间的节点和关系
在这种情况下,将一次创建两个没有属性的节点和关系。 这意味着,的Neo4J数据库没有这两个节点。
使用CQL CREATE命令一次创建两个结束节点和它们之间的新关系。
1 |
CREATE |
语法说明:
执行结果如下:
查看创建的数据
1 |
MATCH (fb1:FaceBookProfile1)-[like:LIKES]->(fb2:FaceBookProfile2) |
结果如下:
1 |
{ |
在这种情况下,将一次创建两个节点和关系属性。 这意味着,的Neo4J数据库没有这两个节点。
使用CQL CREATE命令一次创建两个结束节点和它们之间的新关系。
1 |
CREATE |
语法说明:
可以表示这个{
1 |
{ |
1 |
CREATE (video1:YoutubeVideo1{title:"Action Movie1",updated_by:"Abc",uploaded_date:"10/10/2010"}) |
参数解释如下:
待上述命令执行成功,可通过一下命令查看结果
1 |
MATCH (video1:YoutubeVideo1)-[movie:ACTION_MOVIES]->(video2:YoutubeVideo2) |
可以使用MATCH + RETURN命令来查看单独创建或作为关系的一部分创建的节点的详细信息。
在本章中,将讨论如何检索参与关系的Node的详细信息。
1 |
MATCH |
语法说明:
此示例演示如何检索用于创建关系的“表单节点”和“到节点”节点的详细信息。
1 |
MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc) |
Label是Neo4j数据库中的节点或关系的名称或标识符。可以将此标签名称称为关系为“关系类型”。
可以使用CQL CREATE命令为节点或关系创建单个标签,并为节点创建多个标签。 这意味着Neo4j仅支持两个节点之间的单个关系类型。可以在UI模式和网格模式下在CQL数据浏览器中观察此节点或关系的标签名称。 并且引用它执行CQL命令。到目前为止,只创建了一个节点或关系的标签,但没有讨论它的语法。
使用Neo4j CQL CREATE命令
1 |
CREATE (<node-name>:<label-name>) |
本示例演示如何为“GooglePlusProfile”节点创建单个标签。
1 |
CREATE (google1:GooglePlusProfile) |
这里的google1是一个节点名,GooglePlusProfile是google1node的标签名称
可以观察到在Neo4j数据库中创建了一个标签和一个节点。
1 |
CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>) |
本示例演示如何为“Cinema”节点创建多个标签名称。的客户提供的多个标签名称:Cinema,Film,Movie,Picture。
1 |
CREATE (m:Movie:Cinema:Film:Picture) |
这里m是一个节点名,Movie, Cinema, Film, Picture是m节点的多个标签名称
1 |
CREATE (<node1-name>:<label1-name>)- |
本示例演示如何为关系创建标签
1 |
CREATE (p1:Profile1)-[r1:LIKES]->(p2:Profile2) |
参数解释如下:
像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。
简单WHERE子句语法
1 |
WHERE <condition> |
复杂WHERE子句语法
1 |
WHERE <condition> <boolean-operator> <condition> |
可以使用布尔运算符在同一命令上放置多个条件。
1 |
<property-name> <comparison-operator> <value> |
语法说明:
此示例演示如何在MATCH Command中的CQL WHERE子句中使用多个条件与布尔运算符,以根据员工名称检索员工详细信息。
1 |
MATCH (emp:Employee) |
观察结果,它返回4个员工节点详细信息.
1 |
MATCH (emp:Employee) |
观察到结果,它只返回两个名为“Abc”或“Xyz”的员工详细信息。
在Neo4J CQL中,可以以不同的方式创建拖曳节点之间的关系。
1 |
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) |
语法说明:
1 |
MATCH (cust:Customer),(cc:CreditCard) |
DELETE节点子句语法
1 |
DELETE <node-name-list> |
1 |
MATCH (e: Employee) RETURN e |
1 |
MATCH (e: 'Employee') RETURN e |
所有三个命令都相同,可以选择这些命令中的任何一个。
接下来执行
1 |
MATCH (e: Employee) DELETE e |
现在,而不是“返回e”,使用“DELETE e”命令删除Employee节点
再执行查询语句
1 |
MATCH (e: Employee) RETURN e |
可以发现,数据已被删除。
1 |
DELETE <node1-name>,<node2-name>,<relationship-name> |
首先查询关系
1 |
MATCH (cc:CreditCard)-[r]-(c:Customer)RETURN r |
在这里观察到一个节点为客户,一个节点为信用卡和它们之间的关系是可用的。
接下来执行删除语句
1 |
MATCH (cc: CreditCard)-[rel]-(c:Customer) |
这里可以观察到两个节点及其关联的10个关系被成功删除。
一、用下列 Cypher 语句:
1 |
match (n) detach delete n |
1、停掉服务;
2、删除 graph.db 目录;
3、重启服务。
有时需要向现有节点或关系添加或删除属性 , 使用Neo4j CQL SET子句向现有节点或关系添加新属性,使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。
REMOVE命令用于
删除节点或关系的属性
DELETE和 REMOVE 命令之间的主要区别 -
DELETE操作用于删除节点和关联关系。
REMOVE操作用于删除标签和属性。
DELETE和REMOVE命令之间的相似性 -
这两个命令不应单独使用。
可以使用相同的语法从数据库中永久删除节点或关系的属性或属性列表。
REMOVE属性子句语法
1 |
REMOVE <property-name-list> |
1 |
<node-name>.<property1-name>, |
语法说明:
先创建数据
1 |
CREATE (book:Book {id:122,title:"Neo4j Tutorial",pages:340,price:250}) |
然后查询数据
1 |
MATCH (book : Book) |
解下来执行删除语句(从书节点中删除“price”属性)
1 |
MATCH (book { id:122 }) |
再次查询数据,可以看到此属性已被删除
可以使用相同的语法从数据库中永久删除节点或关系的标签或标签列表。
REMOVE一个Label子句语法:
1 |
REMOVE <label-name-list> |
此示例演示如何从数据库永久删除不需要的标签到节点。
1 |
MATCH (m:Movie) |
有时需要向现有节点或关系添加新属性,要做到这一点,Neo4j CQL 提供了一个SET子句。
Neo4j CQL 已提供 SET 子句来执行以下操作。
SET子句语法
1 |
SET <property-name-list> |
<属性名称列表>语法:
1 |
<node-label-name>.<property1-name>, |
语法说明:
1 |
MATCH (book:Book) |
Neo4j CQL在MATCH命令中提供了“ORDER BY”子句,对MATCH查询返回的结果进行排序。
可以按升序或降序对行进行排序。默认情况下,它按升序对行进行排序。 如果要按降序对它们进行排序,需要使用DESC子句。
ORDER BY子句语法
1 |
ORDER BY <property-name-list> [DESC] |
<property-name-list>
语法:
1 |
<node-label-name>.<property1-name>, |
语法说明:
此示例演示如何按照升序排序“员工名称”结果。
1 |
MATCH (emp:Employee) |
此示例演示如何按照员工名称按降序使用排序结果
1 |
MATCH (emp:Employee) |
与SQL一样,Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。
结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
UNION子句语法
1 |
<MATCH Command1> |
语法说明:
如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。
它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。
结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。
UNION ALL子句语法
1 |
<MATCH Command1> |
如果这两个查询不返回相同的列名和数据类型,那么它抛出一个错误。
LIMIT子句语法
1 |
LIMIT <number> |
语法说明:
得到的结果如下:
Neo4j CQL已提供“SKIP”子句来过滤或限制查询返回的行数。 它修整了CQL查询结果集顶部的结果。如果要从CQL查询结果集底部修整结果,那么应该使用CQL LIMIT子句。
SKIP子句语法:
1 |
SKIP <number> |
语法说明:
1 |
MATCH (emp:Employee) |
与SQL一样,Neo4j CQL提供了一个IN运算符,以便为CQL命令提供值的集合。
IN操作符语法
1 |
IN[<Collection-of-values>] |
语法说明:
1 |
MATCH (e:Employee) |
在Neo4j中,“Id”是节点和关系的默认内部属性。 这意味着,当创建一个新的节点或关系时,Neo4j数据库服务器将为内部使用分配一个数字。 它会自动递增。
以相同的方式,Neo4j数据库服务器为关系分配一个默认Id属性。
和SQL一样,Neo4j CQL提供了一些在RETURN子句中使用的聚合函数。 它类似于SQL中的GROUP BY子句。
可以使用MATCH命令中的RETURN +聚合函数来处理一组节点并返回一些聚合值。
聚合函数列表
它采用一组行和节点或关系的
<property-name>
作为输入,并从给定行的
give <property-name>
列中查找平均值。
函数的语法
1 |
AVG(<property-name> ) |
它采用一组行和节点或关系的
<property-name>
作为输入,并从给定行的
give <property-name>
列中查找求和值。
函数的语法
1 |
SUM(<property-name> ) |
1 |
MATCH (n:Book) RETURN avg(n.born),sum(n.born) |
Neo4j CQL提供了一组关系函数,以在获取开始节点,结束节点等细节时知道关系的细节。
关系函数列表
它需要一个字符串作为输入并为大写格式, 所有CQL函数应使用“()”括号。
1 |
STARTNODE (<relationship-label-name>) |
<relationship-label-name>
可以是来自Neo4j数据库的节点或关系的属性名称。
1 |
MATCH (a)-[movie:ACTION_MOVIES]->(b) |
1 |
MATCH (a)-[movie:ACTION_MOVIES]->(b) |
1 |
MATCH (a)-[movie:ACTION_MOVIES]->(b) |
Neo4j的CQL提供“CREATE INDEX”命令创建的节点或关系的属性索引。
创建索引的语法:
1 |
CREATE INDEX ON :<label_name> (<property_name>) |
冒号(:)运算符用于引用节点或关系标签名称。
上述语法描述它在节点或关系的
1 |
CREATE INDEX ON :Customer (name) |
Neo4j CQL已提供“DROP INDEX”命令删除NODE或Relationship的属性的现有索引。
Drop Index语法:
1 |
DROP INDEX ON :<label_name> (<property_name>) |
冒号(:)运算符用于引用节点或关系标签名称。
上述语法描述它删除在节点或关系的
1 |
DROP INDEX ON :Customer (name) |
像SQL一样,Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束
UNIQUE约束的优点
Neo4j CQL已提供“CREATE CONSTRAINT”命令,以在NODE或关系的属性上创建唯一约束。
1 |
CREATE CONSTRAINT ON (<label_name>) |
语法说明:
上述语法描述了它的
Neo4j CQL提供了“DROP CONSTRAINT”命令,以从NODE或Relationship的属性中删除现有的Unique约束。
删除UNIQUE约束语法:
1 |
DROP CONSTRAINT ON (<label_name>) |
上述语法描述它从节点或关系的
1 |
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'}) |
执行成功后,可以看到数据如下图所示
1 |
MATCH (tom {name: "Tom Hanks"}) RETURN tom |
结果如下:
查询标题为“Cloud Atlas”的电影
1 |
MATCH (people:Person) RETURN people.name LIMIT 10 |
1 |
MATCH (nineties:Movie) WHERE nineties.released >= 1990 AND nineties.released < 2000 RETURN nineties.title |
1 |
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies |
1 |
MATCH (cloudAtlas {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) RETURN directors.name |
1 |
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name |
1 |
MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name, Type(relatedTo), relatedTo |
1 |
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood) |
1 |
MATCH p=shortestPath( |
1 |
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors), |
1 |
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors), |
1 |
MATCH (n1)-[r{roles:['Andrew Marin']}]->(n2) RETURN r, n1, n2 LIMIT 25 |
1 |
MATCH (n1)-[r]->(n2) where "Conductor" in r.roles RETURN r, n1, n2 |
查询结果如下
1 |
MATCH (n) DETACH DELETE n |
1 |
// Count all nodes |
1 |
// Count all relationships |
1 |
// Display constraints and indexes |
1 |
// List node labels |
1 |
// List relationship types |
1 |
// What is related, and how |
1 |
// What kind of nodes exist |
1 |
docker run -d --name container_name \ //-d表示容器后台运行 --name指定容器名字 |
执行完上述命令后就在后台把neo4j容器启动起来了,这个时候你就能在宿主机的浏览器中输入 localhost:7474 输入用户名和密码就能登录到数据库了。
1 |
// 进入容器配置目录挂载在宿主机的对应目录,我这里是/home/neo4j/conf |
保存后退出,重启neo4j容器,可以使用容器的省略id或者生成容器时指定的容器名进行重启。
防火墙设置
1 |
// 查看当前防火墙状态,若为“inactive”,则防火墙已关闭,不必进行接续操作。 |
为了加快速度,使用官方的 Neo4j-import 进行导入
1 |
// 数据准备 |
重启后使用另一台主机向服务器发送http请求进行远程登陆,在浏览器中输入服务器ip:7474
切换连接模式 为 bolt:/ ,输入用户名和密码进行登陆,登陆成功发现在数据库一栏没找到新导入的数据库 graph.db
这是因为配置不够全,继续进到容器挂载到宿主机的 /home/neo4j/conf 中对 neo4j.conf 进行配置
1 |
//在文件末尾添加默认的数据库 |
重新进行远程连接,此时数据库的默认选择应该就切换到了新导入的graph.db。