0%

Neo4j爬坑记

序言

一点浩然气,千里快哉风。

今天来记录自己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
2
3
4
5
6
7
8
CREATE (
<node-name>:<label-name>
{
<key>:<Value>
........
<n-key>:<n-Value>
}
)

示例

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
2
3
4
MATCH 
(
<node-name>:<label-name>
)

示例

1
MATCH (dept:Dept)

但是执行后会报错:

1
2
3
Neo.ClientError.Statement.SyntaxError: 
Query cannot conclude with MATCH
(must be RETURN or an update clause) (line 1, column 1 (offset: 0))

如果你观察到错误消息,它告诉我们,我们可以使用MATCH命令与RETURN子句或UPDATE子句。

RETURN返回

Neo4j CQL RETURN子句用于 -

  • 检索节点的某些属性
  • 检索节点的所有属性
  • 检索节点和关联关系的某些属性
  • 检索节点和关联关系的所有属性

RETURN命令语法:

1
2
3
4
RETURN 
<node-name>.<property1-name>,
........
<node-name>.<propertyn-name>

示例

1
MATCH (e:Employee) RETURN e

1
2
MATCH (dept: Dept)
RETURN dept.deptno,dept.dname,dept.location

关系基础

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
2
3
4
5
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>

还是一系列键值对

示例

1
2
3
MATCH (cust:Customer),(cc:CreditCard) 
CREATE (cust)-[r:DO_SHOPPING_WITH{shopdate:"12/12/2014",price:55000}]->(cc)
RETURN r

检索关系节点的详细信息:

1
2
3
MATCH 
(<node1-label-name>)-[<relationship-label-name>:<relationship-name>]->(<node2-label-name>)
RETURN <relationship-label-name>

示例

1
2
MATCH (cust)-[r:DO_SHOPPING_WITH]->(cc) 
RETURN cust,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
2
3
MATCH (emp:Employee) 
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp

利用WHERE创建指定关系节点:

1
2
3
4
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

有必要补充一下,可以不使用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
2
MATCH (cc: CreditCard)-[rel]-(c:Customer) 
DELETE cc,c,rel

删除所有节点与关系——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
2
3
MATCH (dc:DebitCard) 
REMOVE dc.cvv
RETURN dc

2.REMOVE一个Label子句语法:

1
REMOVE <label-name-list>
S.No. 语法元素 描述
1. REMOVE 它是一个Neo4j CQL关键字。
2. 它是一个标签列表,用于永久性地从节点或关系中删除它。

语法

1
2
3
<node-name>:<label2-name>, 
....
<node-name>:<labeln-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
2
3
MATCH (dc:DebitCard)
SET dc.atm_pin = 3456
RETURN dc

模式匹配

模式匹配是Cypher语句的重要部分

image-20201218162301263

当描述关系时,在方括号里面的冒号(:)后面指定关系的类型。当建立关系(句法上大小写敏感)时,类型必须与它定义的类型严格一致。这个简单的查询使用[:HAS_SEEN]句法描述了单个HAS_SEEN关系。

关系方向的描述是在Cypher中用ASCII实现的。关系的连接是用ASCII箭 头(单个连字符接着一个大于号或前面有一个小于号[]->或<-[])连接着它 的端点。关系的起点使用单个连字符连接([]-)。在前面的例子中,匹配用户看过的电影(match(user)-[:HAS_SEEN]->(movie))模式指定了从user节点指向movie节点的HAS_SEEN关系。

在Cypher查询中,节点和关系都可以与标识关联,这种关联使得以后可以在同样的查询中引用同一个图形实体。下面的例子在返回语句中引用了 movie节点。

image-20201218162951725

个人备忘

1
2
LOAD CSV WITH HEADERS FROM "file:///Users/Desktop/workJava/ossez/classes.csv" as line
MERGE (n:node {classname:line.ClassName}) RETURN n
1
2
3
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r
1
2
3
结点可以没有名字 但是label一定要有

nodename:labelname
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//4个人
CREATE (t:person {name:"tom", age:35, address: "beijing"})
CREATE (p:person {name:"peter", age:25, address: "nanjing"})
CREATE (a:person {name:"alice", age:30, address: "hebei"})
CREATE (d:person {name:"donny", age:23, address: "hunan"})

//3个宠物
CREATE (a:pet {name:"doga", age:23, address: "hunan"})
CREATE (b:pet {name:"dogb", age:23, address: "hunan"})
CREATE (c:pet {name:"dogc", age:23, address: "hunan"})

//5部电影
CREATE (h:movie {name:"hulk", date:2002, nation: "usa"})
CREATE (ca:movie {name:"captainamerican", date:2008, nation: "usa"})
CREATE (he:movie {name:"hawkeye", date:2010, nation: "usa"})
CREATE (i:movie {name:"ironman", date:2011, nation: "usa"})
CREATE (w:movie {name:"widow", date:2020, nation: "usa"})

//创建关系

MATCH (t:person),(a:pet)
WHERE t.name = "tom" AND a.name = "doga"
CREATE (t)-[f:feed]->(a)

MATCH (t:person {name:"tom"}),(a:pet {name:"doga"})
CREATE (t)-[f:feed]->(a)

MERGE (t:person {name:"tom"})-[f:feed]->(a:pet {name:"doga"})

//查询属性里有date值为2002年的东西
match(n)
where n.date=2002
return n

match(n{date:2002})
return n

// Get some data

MATCH (n1)-[r]->(n2) RETURN r, n1, n2 LIMIT 25




//删除person结点
match (n:person) delete n

//只是删除feed关系
MATCH p=()-[f:feed]->() DELETE f

match (n)-[f:feed]-()
detach delete f