CQL代表Cypher查询语言。 像关系型数据库具有查询语言SQL,Neo4j使用CQL作为查询语言。
Neo4j CQL
常用的Neo4j CQL命令/条款如下:
CQL命令/条 | 作用 |
CREATE 创建 | 创建节点,关系和属性 |
MATCH 匹配 | 检索有关节点,关系和属性数据 |
RETURN 返回 | 返回查询结果 |
WHERE 条件 | 提供条件过滤检索MATCH数据 |
DELETE 删除 | 删除节点和关系 |
REMOVE 移除 | 删除节点和关系的属性 |
SET 设置 | 添加或更新标签 |
ORDER BY 排序 | 对结果排序 |
SKIP LIMIT 分页 | 分页 |
DISTINCT 排重 | 排重 |
完成上面的语法,我们基于庆余年电视剧人物关系图片:
- CREATE (
- <node-name>:<label-name>
- [{
- <property1-name>:<property1-Value>
- ........
- <propertyn-name>:<propertyn-Value>
- }]
- )
注意:方括号中的部分,代表可选内容。
语法说明:
语法元素 | 描述 |
< node-name> | 它是我们将要创建的节点名称。 |
< label-name> | 它是一个节点标签名称 |
< property1-name>...< propertyn-name> | 属性是键值对。 定义将分配给创建节点的属性的名称 |
< property1-value>...< propertyn-value> | 属性是键值对。 定义将分配给创建节点的属性的值 |
举例:
- CREATE (person:Person);
-
- CREATE (person:Person {cid:1,name:"范闲",age:24,gender:0,character:"A",money:1000});
- CREATE (person:Person {cid:2,name:"林婉儿",age:20,gender:1,character:"B",money:800});
- CREATE (person:Person {cid:3,name:"庆帝",age:49,gender:0,character:"A",money:8900});
-
- MATCH
- (
- <node-name>:<label-name>
- )
- RETURN
- <node-name>.<property1-name>,
- ...
- <node-name>.<propertyn-name>
语法说明:
语法元素 | 描述 |
< node-name> | 它是我们将要创建的节点名称。 |
< label-name> | 它是一个节点标签名称 |
< property1-name>...< propertynname> | 属性是键值对。 定义将分配给创建节点的属性的名称 |
举例:
- MATCH (person:Person) return person
- MATCH (person:Person) return person.name,person.age
(1)使用现有节点创建没有属性的关系
- MATCH (<node1-name>:<node1-label-name>),(<node2-name>:<node2-label-name>)
- CREATE
- (<node1-name>)-[<relationship-name>:<relationship-label-name>]->(<node2-name>)
- RETURN 相应的内容
语法说明:
语法元素 | 描述 |
MATCH,CREATE,RETURN | 他们是Neo4J CQL关键字。 |
< noode1-name> | 它用于创建关系的“From Node”的名称。 |
< node1-label-name> | 它用于创建关系的“From Node”的标签名称。 |
< node2-name> | 它用于创建关系的“To Node”的名称。 |
< node2-label-name> | 它用于创建关系的“To Node”的标签名称。 |
< relationship-name> | 这是一个关系的名称。 |
< relationship-label-name> | 它是一个关系的标签名称。 |
- 创建关系
- match(person:Person {name:"范闲"}) ,(person2:Person {name:"林婉儿"})
- create(person)-[r:Couple]->(person2);
-
- 查询关系
- match p = (person:Person {name:"范闲"})-[r:Couple]->(person2:Person) return p
- match (p1:Person {name:"范闲"})-[r:Couple]-(p2:Person) return p1,p2
- match (p1:Person {name:"范闲"})-[r:Couple]-(p2:Person) return r
注:我们在浏览器中输入命令,默认只能单行而不能使用多行,一回车命令就开始执行了。我们可以设置一下,是它能够使用多行执行命令。见下图:
勾选后我们如果想要切换到下一行,继续编写命令,只需要按住shirt+回车键,就能换行。如果想要运行命令,直接按回车键就能执行了。
(2)使用现有节点创建有属性的关系
- MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
- CREATE
- (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
- {<define-properties-list>}]->(<node2-label-name>)
- RETURN <relationship-label-name>
-
-
- 其中<define-properties-list> 是分配给新创建关系的属性(名称 - 值对)的列表。
- {
- <property1-name>:<property1-value>,
- <property2-name>:<property2-value>,
- ...
- <propertyn-name>:<propertyn-value>
- }
- match(person:Person {name:"范闲"}),(person2:Person {name:"林婉儿"})
- create(person)-[r:Couple{mary_date:"12/12/2014",price:55000}]->(person2)
- return r;
(3)使用新节点创建没有属性的关系
- CREATE
- (<node1-label-name>:<node1-name>)
- -[<relationship-label-name>:<relationship-name>]->
- (<node1-label-name>:<node1-name>)
- create
- (person1:Person {cid:4,name:"长公主",age:49,gender:1,character:"A",money:5000})
- -[r:Friend]->
- (person2:Person {cid:7,name:"九品射手燕小乙",age:48,gender:0,character:"B",money:1000})
(4)使用新节点创建有属性的关系
- CREATE
- (<node1-label-name>:<node1-name>{<define-properties-list>})
- -[<relationship-label-name>:<relationship-name>{<define-properties-list>}]
- ->(<node1-label-name>:<node1-name>{<define-properties-list>})
- create
- (person1:Person {cid:9,name:"靖王世子",age:23,gender:0,character:"A",money:3000})
- <-[r:Friend {date:"11-02-2000"}]->
- (person2:Person {cid:8,name:"二皇子",age:24,gender:0,character:"B",money:6000})
注:这个 -> 代表生成的两个节点,连接线箭头的指向。
关系和节点的属性可以使用的类型
CQL数据类型 | 作用 |
boolean | 它用于表示布尔文字:true, false。 |
byte | 它用来表示8位整数。 |
short | 它用于表示16位整数。 |
int | 它用于表示32位整数。 |
long | 它用于表示64位整数。 |
float | 浮点数用于表示32位浮点数。 |
double | Double用于表示64位浮点数。 |
char | Char用于表示16位字符。 |
String | 字符串用于表示字符串。 |
- CREATE (
: : .....: ) - 如:
- CREATE (person:Person:Beauty:Picture {cid:20,name:"小美女"})
- 简单的WHERE子句
- WHERE <condition>
-
- 复杂的WHERE子句
- WHERE <condition> <boolean-operator> <condition>
where 中的比较运算符 和 之前mysql的相同 如 = != <> > < 等
布尔运算符 | 描述 |
AND | 与 |
OR | 或 |
NOT | 非 |
- MATCH (person:Person)
- WHERE person.name = '范闲' OR person.name = '靖王世子'
- RETURN person
DELETE 子句
- match p = (:Person {name:"林婉儿"})-[r:Couple]-(:Person) delete r
-
- 删除空白节点(里面只有<id>,无其他任何内容)
- match(n) where id(n)=86 delete n
- 其中id就是我们创造任何一个节点时自动创建的且唯一的,有点像标识符。
- 删除时很容易被误写成下面的形式:
- match(n) where n.id=86 delete n ×(这是错的)
- 这是找不到这样的n的,也就无法删除,与普通属性不太一样哈
REMOVE子句
- MATCH (person:Person {name:"小美女"})
- REMOVE person.cid
- MATCH (person:Person {cid:1})
- SET person.money = 3456,person.age=25
- MATCH (person:Person)
- RETURN person.name,person.money
- ORDER BY person.money DESC
- MATCH (person:Person)
- RETURN ID(person),person.name,person.money
- ORDER BY person.money DESC skip 4 limit 2
这个函数的用法就像SQL中的distinct关键字,返回的是所有不同值。
MATCH (p:Person) RETURN Distinct(p.character)