序言
一点浩然气,千里快哉风。
今天来记录自己Neo4j实战、爬坑记录。
简介
图数据库只有两点:节点,关系。
节点node可以类比理解为Java里面的对象实例,关系其实就是edge边信息。
查询语句CQL:CYPHER
类似SQL语句一样,在Neo4j里面是使用Cypher语句进行查询。
Cypher句法由四个不同的部分组成,每一部分都有一个特殊的规则:
start——查找图形中的起始节点。
match——匹配图形模式,可以定位感兴趣数据的子图形。
where——基于某些标准过滤数据。
return——返回感兴趣的结果。
Cypher的模式匹配性质使得图形模式成为任何查询的重点问题。
常用的Neo4j CQL命令/条款如下:
S.No. | CQL命令/条 | 用法 |
---|---|---|
1。 | CREATE 创建 | 创建节点,关系和属性 |
2。 | MATCH 匹配 | 检索有关节点,关系和属性数据 |
3。 | RETURN 返回 | 返回查询结果 |
4。 | WHERE 哪里 | 提供条件过滤检索数据 |
5。 | DELETE 删除 | 删除节点和关系 |
6。 | REMOVE 移除 | 删除节点和关系的属性 |
7。 | ORDER BY以…排序 | 排序检索数据 |
8。 | SET 组 | 添加或更新标签 |
命令
CREATE创建
Neo4j CQL创建一个没有属性的节点
1 | CREATE (<node-name>:<label-name>) 节点名:标签名 |
示例
1 | CREATE (emp:Employee) |
或者
1 | CREATE (:Employee) |
Neo4j CQL创建具有属性的节点
Neo4j CQL“CREATE”命令用于创建带有属性的节点。 它创建一个具有一些属性(键值对)的节点来存储数据。
1 | CREATE ( |
示例
1 | CREATE (dept:Dept { deptno:10, dname:"Accounting", location:"Hyderabad"}) |
创建多个标签到节点
语法:
1 | CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)复制代码 |
示例
1 | CREATE (m:Movie:Cinema:Film:Picture) 一个节点有多个标签 |
MATCH查询
Neo4j CQL MATCH命令用于
- 从数据库获取有关节点和属性的数据
- 从数据库获取有关节点,关系和属性的数据
MATCH命令语法:
1 | MATCH |
示例
1 | MATCH (dept:Dept) |
但是执行后会报错:
1 | Neo.ClientError.Statement.SyntaxError: |
如果你观察到错误消息,它告诉我们,我们可以使用MATCH命令与RETURN子句或UPDATE子句。
RETURN返回
Neo4j CQL RETURN子句用于 -
- 检索节点的某些属性
- 检索节点的所有属性
- 检索节点和关联关系的某些属性
- 检索节点和关联关系的所有属性
RETURN命令语法:
1 | RETURN |
示例
1 | MATCH (e:Employee) RETURN e |
或
1 | MATCH (dept: Dept) |
关系基础
Neo4j图数据库遵循属性图模型来存储和管理其数据。
根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。
基于方向性,Neo4j关系被分为两种主要类型。
- 单向关系
- 双向关系
使用新节点创建关系
示例
1 | CREATE (e:Employee)-[r:DemoRelation]->(c:Employee) |
这句会创建节点e,节点c,以及e -> c的关系r,这里需要注意方向,比如双向是
1 | CREATE (e:Employee)<-[r:DemoRelation]->(c:Employee) |
使用已知节点创建带属性的关系:
1 | MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) |
还是一系列键值对
示例
1 | MATCH (cust:Customer),(cc:CreditCard) |
检索关系节点的详细信息:
1 | MATCH |
示例
1 | MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc) |
WHERE子句
像SQL一样,Neo4j CQL在CQL MATCH命令中提供了WHERE子句来过滤MATCH查询的结果。
简单WHERE子句语法
1 | WHERE <property-name> <comparison-operator> <value> |
语法说明:
S.No. | 语法元素 | 描述 |
---|---|---|
1 | WHERE | 它是一个Neo4j CQL关键字。 |
2 | <属性名称> | 它是节点或关系的属性名称。 |
3 | <比较运算符> | 它是Neo4j CQL比较运算符之一。 |
4 | <值> | 它是一个字面值,如数字文字,字符串文字等。 |
Neo4j CQL中的比较运算符
Neo4j 支持以下的比较运算符,在 Neo4j CQL WHERE 子句中使用来支持条件
S.No. | 布尔运算符 | 描述 |
---|---|---|
1. | = | 它是Neo4j CQL“等于”运算符。 |
2. | <> | 它是一个Neo4j CQL“不等于”运算符。 |
3. | < | 它是一个Neo4j CQL“小于”运算符。 |
4. | > | 它是一个Neo4j CQL“大于”运算符。 |
5. | <= | 它是一个Neo4j CQL“小于或等于”运算符。 |
6. | = | 它是一个Neo4j CQL“大于或等于”运算符。 |
我们可以使用布尔运算符在同一命令上放置多个条件。
Neo4j CQL中的布尔运算符
Neo4j支持以下布尔运算符在Neo4j CQL WHERE子句中使用以支持多个条件。
S.No. | 布尔运算符 | 描述 |
---|---|---|
1 | AND | 它是一个支持AND操作的Neo4j CQL关键字。 |
2 | OR | 它是一个Neo4j CQL关键字来支持OR操作。 |
3 | NOT | 它是一个Neo4j CQL关键字支持NOT操作。 |
4 | XOR | 它是一个支持XOR操作的Neo4j CQL关键字。 |
示例
1 | MATCH (emp:Employee) |
利用WHERE
创建指定关系节点:
1 | MATCH (cust:Customer),(cc:CreditCard) |
有必要补充一下,可以不使用WHERE达到WHERE
的一些效果,比如
1 | MATCH p=(m:Bot{id:123})<-[:BotRelation]->(:Bot) RETURN p |
DELETE删除
Neo4j使用CQL DELETE子句
- 删除节点。
- 删除节点及相关节点和关系。
DELETE节点子句语法
1 | DELETE <node-name-list> |
示例
1 | MATCH (e: Employee) DELETE e |
DELETE节点和关系子句语法
1 | DELETE <node1-name>,<node2-name>,<relationship-name> |
示例
1 | MATCH (cc: CreditCard)-[rel]-(c:Customer) |
删除所有节点与关系——delete
删除单个节点:MATCH (n:Useless) DELETE n;
删除单个节点和连接它的关系:MATCH (n { name: 'Andres' })-[r]-() DELETE n, r
删除所有节点和关系:MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r
删除某一类关系:match (n)-[r:created]-() DELETE r
REMOVE删除
有时基于我们的客户端要求,我们需要向现有节点或关系添加或删除属性。
我们使用Neo4j CQL SET子句向现有节点或关系添加新属性。
我们使用Neo4j CQL REMOVE子句来删除节点或关系的现有属性。
Neo4j CQL REMOVE命令用于
- 删除节点或关系的标签
- 删除节点或关系的属性
Neo4j CQL DELETE和REMOVE命令之间的主要区别 -
- DELETE操作用于删除节点和关联关系。
- REMOVE操作用于删除标签和属性。
Neo4j CQL DELETE和REMOVE命令之间的相似性 -
- 这两个命令不应单独使用。
- 两个命令都应该与MATCH命令一起使用。
1.REMOVE属性子句语法
1 | REMOVE <node-name>.<property1-name>,<node-name>.<property2-name> |
示例
1 | MATCH (dc:DebitCard) |
2.REMOVE一个Label子句语法:
1 | REMOVE <label-name-list> |
S.No. | 语法元素 | 描述 |
---|---|---|
1. | REMOVE | 它是一个Neo4j CQL关键字。 |
2. | 它是一个标签列表,用于永久性地从节点或关系中删除它。 |
语法
1 | <node-name>:<label2-name>, |
删除标签与属性——remove
删除属性:MATCH (andres { name: 'Andres' }) REMOVE andres.age RETURN andres;
删除节点的标签:MATCH (n { name: 'Peter' }) REMOVE n:German RETURN n;
删除多重标签:MATCH (n { name: 'Peter' }) REMOVE n:German:Swedish RETURN n
SET子句
有时,根据我们的客户端要求,我们需要向现有节点或关系添加新属性。
要做到这一点,Neo4j CQL提供了一个SET子句。
Neo4j CQL已提供SET子句来执行以下操作。
- 向现有节点或关系添加新属性
- 添加或更新属性值
SET子句语法
1 | SET <node-label-name>.<property1-name>,...<node-laben-name>.<propertyn-name>复制代码 |
语法说明:
S.No. | 语法元素 | 描述 |
---|---|---|
1 | <节点标签名称> | 这是一个节点的标签名称。 |
2 | <属性名称> | 它是一个节点的属性名。 |
示例
1 | MATCH (dc:DebitCard) |
模式匹配
模式匹配是Cypher语句的重要部分
当描述关系时,在方括号里面的冒号(:)后面指定关系的类型。当建立关系(句法上大小写敏感)时,类型必须与它定义的类型严格一致。这个简单的查询使用[:HAS_SEEN]句法描述了单个HAS_SEEN关系。
关系方向的描述是在Cypher中用ASCII实现的。关系的连接是用ASCII箭 头(单个连字符接着一个大于号或前面有一个小于号[]->或<-[])连接着它 的端点。关系的起点使用单个连字符连接([]-)。在前面的例子中,匹配用户看过的电影(match(user)-[:HAS_SEEN]->(movie))模式指定了从user节点指向movie节点的HAS_SEEN关系。
在Cypher查询中,节点和关系都可以与标识关联,这种关联使得以后可以在同样的查询中引用同一个图形实体。下面的例子在返回语句中引用了 movie节点。
个人备忘
1 | LOAD CSV WITH HEADERS FROM "file:///Users/Desktop/workJava/ossez/classes.csv" as line |
1 | MATCH (n) |
1 | 结点可以没有名字 但是label一定要有 |
1 | //4个人 |