neo4j简版教程
create (<node-name:<label-name2>:<label-name2>......>) return <node-name>
可以给一个节点创建多label的node
eg:
CREATE (dept:Dept { deptno:10,dname:"Accounting",location:"Hyderabad" })
Neo4j CQL创建具有属性的节点
CREATE (
<node-name>:<label-name>
{
<Property1-name>:<Property1-Value>
........
<Propertyn-name>:<Propertyn-Value>
}
)
Match命令
MATCH
(
<node-name>:<label-name>
)
Return命令
RETURN
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>
Match Return
MATCH Command
RETURN Command
eg:
MATCH (dept: Dept)
RETURN dept.deptno,dept.dname
一个完整的命令
CREATE+MATCH+RETURN命令
在Neo4j CQL中,我们不能单独使用MATCH或RETURN命令,因此我们应该结合这两个命令从数据库检索数据。
neo4j关系
Neo4j图数据库遵循属性图模型来存储和管理其数据。
根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。
基于方向性,Neo4j关系被分为两种主要类型。
- 单向关系
- 双向关系
现有节点创建无属性的关系(关系也可以有属性)
语法:
MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>)
CREATE
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>]->(<node2-label-name>)
RETURN <relationship-label-name>
match 匹配现有节点,create创建现有关系,return返回关系语句。
现有节点创建有属性的关系(即给关系加上属性值)、
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> }
return语句是可以省略的(如果不想看到结果)
eg:
MATCH (cust:Customer),(cc:CreditCard)
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)
RETURN r
创建新节点和属性:
一次性创建两个新节点并创建没有属性的关系
CREATE
(<node1-label-name>:<node1-name>)-[<relationship-label-name>:<relationship-name>]-> (<node1-label-name>:<node1-name>)
RETURN <relationship-label-name>
eg:
CREATE (fb1:FaceBookProfile1)-[like:LIKES]->(fb2:FaceBookProfile2)
创建新节点并创建带属性的关系
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>})
RETURN <relationship-label-name>
<define-properties-list>语法
{
<property1-name>:<property1-value>,
<property2-name>:<property2-value>,
...
<propertyn-name>:<propertyn-value>
}
获取(检查)节点或者关系的详细信息:
MATCH
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>]->(<node2-label-name>)
RETURN <relationship-label-name>
MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc) RETURN cust,cc
where字句
简单where字句:
WHERE <condition>
复杂WHERE子句语法
WHERE <condition> <boolean-operator> <condition>
<condition>语法
<property-name> <comparison-operator> <value>
boolean-operator运算符:
and or not xor
比较运算符:
= , <>不等于,>,<,>=,<=
delete删除
分两类:
1、删除节点
2、删除节点及相关节点和关系
删除节点
从数据库永久删除节点及其关联的属性。
DELETE <node-name-list>
eg:
MATCH (e: Employee) DELETE e
先用match匹配,然后用delete删除,删除单个节点
note:即先前用match匹配,然后return返回,现在只需要把return换成delete
delete节点和关系字句
DELETE <node1-name>,<node2-name>,<relationship-name>
note:这个delete只适合当前两个节点有关系,两个节点与其它节点均无关系。
当删除某个节点A时,若不一起删除与节点A相关的关系,将出现报错error并无法删除
这是属性图的限制--(这是删除的节点上有连接的关系)。
解决方法:
1、删除所有的关系,再删除节点
2、选择使用detach delete子句。detach delete字句允许你删除一个节点的同时删除与其相连的关系。
第2中方案的使用方法:
match (a:Artist {name:"张三"}) detach delete a
删除整个数据库:
MATCH (n) DETACH DELETE n
remove删除:
向现有节点或者关系删除属性
Neo4j CQL REMOVE命令用于
- 删除节点或关系的标签
- 删除节点或关系的属性
Neo4j CQL DELETE和REMOVE命令之间的主要区别 -
- DELETE操作用于删除节点和关联关系。
- REMOVE操作用于删除标签和属性。
Neo4j CQL DELETE和REMOVE命令之间的相似性 -
- 这两个命令不应单独使用。
- 两个命令都应该与MATCH命令一起使用。
REMOVE属性子句语法
REMOVE <property-name-list>
eg:
MATCH (book { id:122 })
REMOVE book.price
RETURN book
set字句
向现有节点或关系添加新属性
Neo4j CQL已提供SET子句来执行以下操作。
- 向现有节点或关系添加新属性
- 添加或更新属性值
- SET <property-name-list>
eg:
MATCH (dc:DebitCard)
SET dc.atm_pin = 3456
RETURN dc
sortging 排序:
order by排序,默认按照行进行升序的排序,若使用降序,则使用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>
注意 -
应该使用逗号(,)运算符来分隔属性名列表。
eg:
MATCH (emp:Employee)
RETURN emp.empid,emp.name,emp.salary,emp.deptno
ORDER BY emp.name
MATCH (emp:Employee) RETURN emp.empid,emp.name,emp.salary,emp.deptno ORDER BY emp.name DESC
UNION联盟
Neo4j CQL有两个子句,将两个不同的结果合并成一组结果
- UNION
- UNION ALL
它将两组结果中的公共行组合并返回到一组结果中。 它不从两个节点返回重复的行。
限制:
结果列类型和来自两组结果的名称必须匹配,这意味着列名称应该相同,列的数据类型应该相同。
UNION子句语法
<MATCH Command1>
UNION
<MATCH Command2>
eg:
MATCH (cc:CreditCard) RETURN cc.id,cc.number UNION
MATCH (dc:DebitCard) RETURN dc.id,dc.number
观察结果列(return返回的列),但是由于上述的句子具有不同的节点前缀,会报错,可以使用as子句来提供别名
eg:
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 ALL子句
它结合并返回两个结果集的所有行成一个单一的结果集。它还返回由两个节点重复行。
限制
结果列类型,并从两个结果集的名字必须匹配,这意味着列名称应该是相同的,列的数据类型应该是相同的。
UNION ALL子句语法
<MATCH Command1>
UNION ALL
<MATCH Command2>
eg:
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
LIMIT和SKIP子句
CQL LIMIT子句
Neo4j CQL已提供“LIMIT”子句来过滤或限制查询返回的行数。
LIMIT子句语法
LIMIT <number>
eg:
MATCH (emp:Employee) RETURN emp LIMIT 2
CQL SKIP子句
Neo4j CQL已提供“SKIP”子句来过滤或限制查询返回的行数
即:跳过return结果集中前面的记录个数
MATCH (emp:Employee) RETURN emp SKIP 2
merge命令:
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> })
解释:
比如create (张三:Person {age:18})
在使用create命令创建爱新节点时,若是相同的语句执行两个或者多个,那么每一次的执行都会创建新的节点,并且是相互独立的。
那么merge (张三:Person{age:18})
执行多个依然是一个节点。
merge命令检查该节点在数据库中是否可用。 如果它不存在,它创建新节点。 否则,它不创建新的。
NULL值:
Neo4j CQL将空值视为对节点或关系的属性的缺失值或未定义值。
比如在创建Person标签时,一般包含name,age,address
但是在创建一个Person新节点时,若未指定这些属性,则默认填充是null(这个是return返回的实例属性有关)
可以通过where字句来限制返回某些属性是否null
eg:
match (e:Employee) where e.name is not null return e.name,e.age
返回name不为null的记录
或者where字句设置成 where e.name is null,返回name为null的属性
In操作符
IN操作符语法
IN[<Collection-of-values>]
其中[,]是集合的开始和结束
eg:
MATCH (e:Employee)
WHERE e.id IN [123,124]
RETURN e.id,e.name,e.sal,e.deptno
图形字体
目的是更改UI中字体的大小和颜色
新版本的UI信息:
CQL函数:
字符串函数
包含:
UPPER
LOWER
SBUSTRING
REPLACE
函数语法
UPPER (<input-string>)
注意:-
<input-string>可以是来自Neo4J数据库的节点或关系的属性名称。
eg:
MATCH (e:Employee)
RETURN e.id,UPPER(e.name),e.sal,e.deptno
SUBSTRING
它接受一个字符串作为输入和两个索引:一个是索引的开始,另一个是索引的结束,并返回从StartInded到EndIndex-1的子字符串。 所有CQL函数应使用“()”括号。
SUBSTRING(<input-string>,<startIndex> ,<endIndex>)
注意:-
在Neo4J CQL中,如果一个字符串包含n个字母,则它的长度为n,索引从0开始,到n-1结束。
<startIndex>是SUBSTRING函数的索引值。
<endIndex>是可选的。 如果我们省略它,那么它返回给定字符串的子串从startIndex到字符串的结尾。
聚合函数:
COUNT
MAX
MIN
SUM
AVG
函数语法
COUNT(<value>)
注意 -
<value>可以是*,节点或关系标签名称或属性名称。
ATCH (e:Employee) RETURN COUNT(*)
[MAX|MIN|AVG](<property-name>)
注意 -
<property-name>应该是节点或关系的名称。
MATCH (e:Employee)
RETURN SUM(e.sal),AVG(e.sal)
比如,存在这样一个记录:
MATCH (video1:YoutubeVideo1)-[movie:ACTION_MOVIES]->(video2:YoutubeVideo2)
RETURN movie
检测关系的开始节点:
MATCH (a)-[movie:ACTION_MOVIES]->(b)
RETURN STARTNODE(movie)
检测关系的结束节点:
MATCH (a)-[movie:ACTION_MOVIES]->(b) RETURN ENDNODE(movie)
MATCH (a)-[movie:ACTION_MOVIES]->(b) RETURN ID(movie),TYPE(movie)
返回的是:movie的ID和movie的类型type(ACTION_MOVIES)
CQL 索引
Neo4j SQL支持节点或关系属性上的索引,以提高应用程序的性能。
我们可以为具有相同标签名称的所有节点的属性创建索引。
我们可以在MATCH或WHERE或IN运算符上使用这些索引列来改进CQL Command的执行。
Neo4J索引操作
- Create Index 创建索引
- Drop Index 丢弃索引
创建索引的语法:
CREATE INDEX ON :<label_name> (<property_name>)
注意:-
冒号(:)运算符用于引用节点或关系标签名称。
上述语法描述它在节点或关系的<label_name>的<property_name>上创建一个新索引。
CREATE INDEX ON :Customer (name)
Drop Neo4j索引
Neo4j CQL已提供“DROP INDEX”命令删除NODE或Relationship的属性的现有索引。
Drop Index语法:
DROP INDEX ON :<label_name> (<property_name>)
注意:-
冒号(:)运算符用于引用节点或关系标签名称。
上述语法描述它删除在节点或关系的<label_name>的<property_name>上创建的现有索引。
CQL UNIQUE约束
在Neo4j数据库中,CQL CREATE命令始终创建新的节点或关系,这意味着即使您使用相同的值,它也会插入一个新行。 根据我们对某些节点或关系的应用需求,我们必须避免这种重复。 然后我们不能直接得到这个。 我们应该使用一些数据库约束来创建节点或关系的一个或多个属性的规则。Neo4j数据库也支持对NODE或Relationship的属性的UNIQUE约束
UNIQUE约束的优点
- 避免重复记录。
- 强制执行数据完整性规则。
Neo4j CQL UNIQUE约束操作
- 创建UNIQUE约束
- 丢弃UNIQUE约束。
创建UNIQUE约束
Neo4j CQL已提供“CREATE CONSTRAINT”命令,以在NODE或关系的属性上创建唯一约束。
创建唯一约束语法
CREATE CONSTRAINT ON (<label_name>)
ASSERT <property_name> IS UNIQUE
assert是neo4j的关键字
删除UNIQUE约束
Neo4j CQL提供了“DROP CONSTRAINT”命令,以从NODE或Relationship的属性中删除现有的Unique约束。
删除UNIQUE约束语法:
DROP CONSTRAINT ON (<label_name>) ASSERT <property_name> IS UNIQUE
neo4j的函数概括图:
https://neo4j.com/docs/cypher-refcard/current/