Neo4j 基础教程
一. 安装Neo4j 前,需要安装 JDK
二. 配置Neo4j
访问协议有: Bolt(7687) , HTTP(7474) , HTTPS(7473)
默认只允许本地访问,如果需要允许远程主机访问,需要设置这个属性为 0.0.0.0,且设置防火墙允许对应端口访问:
dbms.connectors.default_listen_address=0.0.0.0
三. 启动Neo4j
启动命令:neo4j.bat console
启动服务,停止服务,重启服务和查询服务的状态:
bin\neo4j start
bin\neo4j stop
bin\neo4j restart
bin\neo4j status
四. Neo4j 集成浏览器
浏览器打开 “http://localhost:7474/” 默认的用户是neo4j,默认的密码是:neo4j,第一次成功connect到Neo4j服务器之后,需要重置密码。
图的基本概念:一个属性图是有向图,由顶点(Vertex),边(Edge),标签(Lable),关系类型(Relationship Type)和属性(Property)组成。
一. 基本概念
实体(Entity)是指节点(Node)和关系(Relationship);
路径(Path)是指由起始节点和终止节点之间的实体(节点和关系)构成的有序组合;
标记(Token)是非空的字符串,用于表示 标签(Lable)、关系类型(Relationship Type)、或属性键(Property Key);
标签(Label):用于对节点进行分组,多个节点可以有相同的标签,一个节点可以有多个标签,拥有相同标签的节点属于同一个分组;
关系类型(Relationship Type):用于表示关系的类型,多个关系可以有相同的关系类型,但是一个关系仅有一个关系类型;
属性键:用于唯一标识一个属性,在一个关系或节点中,属性键是唯一的;
属性(Property)是一个键值对(Key/Value Pair),每个节点或关系可以有一个或多个属性;属性值可以是标量类型(Boolean、Integer、Float、String)、或组合类型(List,Map);
一. 基本知识
和SQL很相似,Cypher语言的关键字不区分大小写,但是属性值,标签,关系类型和变量是区分大小写的。
1. 变量(区分大小写)
如:【 MATCH (n)-->(b) RETURN b 】 n , b 就是变量
2. 访问属性
格式是:Variable.PropertyKey
match (n)-->(b) where id(n)=5 and b.age=18 return b;
二. 创建节点
节点模式的构成:(Variable:Lable1:Lable2{Key1:Value1,Key2,Value2})
如:【create (n:Person { name:'Tom Hanks', born:1956})returnn;】
三. 查询节点
通过match子句查询数据库
1. 查询整个图形数据库
match(n) returnn;
2. 根据属性查询
match(n) where n.born < 1955 return n;
3. 查询具有指定Lable的节点
match(n:Movie) return n;
4. 查询具有指定属性的节点
match(n{name:'Tom Hanks'}) return n;
四. 创建关系
关系的构成:StartNode - [Variable:RelationshipType{Key1:Value1,Key2:Value2}] -> EndNode,在创建关系时,必须指定关系类型。
1,创建没有任何属性的关系
MATCH (a:Person),(b:Movie)
WHERE a.name ='Robert Zemeckis' AND b.title ='Forrest Gump'CREATE (a) -[r:DIRECTED]-> (b)
RETURN r;
2,创建关系,并设置关系的属性
MATCH (a:Person),(b:Movie)
WHERE a.name ='Tom Hanks'AND b.title ='Forrest Gump'CREATE (a)-[r:ACTED_IN { roles:['Forrest'] }]->(b)
RETURN r;
五. 查询关系
在Cypher中,关系分为三种:符号“--”,表示有关系,忽略关系的类型和方向;符号“-->”和“<--”,表示有方向的关系;
1,查询整个数据图形
match(n) return n;
2,查询跟指定节点有关系的节点
match(n) -- (m:Movice)
return n;
3,查询有向关系的节点
MATCH (:Person { name:'Tom Hanks'})-->(movie)
RETURN movie;
4,为关系命名,通过[r]为关系定义一个变量名,通过函数type获取关系的类型
MATCH (:Person { name:'Tom Hanks'})-[r]->(movie)
RETURN r,type(r);
5. 询特定的关系类型,通过[Variable:RelationshipType{Key:Value}]指定关系的类型和属性
MATCH (:Person { name:'Tom Hanks'})-[r:ACTED_IN{roles:'Forrest'}]->(movie)
RETURN r,type(r);
六. 更新图形
1,创建一个完整的Path
CREATE p =(vic:Worker:Person{ name:'vic',title:"Developer"})-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael:Worker:Person { name:'Michael',title:"Manager" })
RETURN p
2,为节点增加属性
match (n)
where id(n)=7
set n.name ='neo'
return n;
3,为节点增加标签
match (n)
where id(n)=7
set n:Company
return n;
4,为关系增加属性
match (n)<-[r]-(m)
where id(n)=7 and id(m)=8
se tr.team='Azure'
return n;
七. 跟实体相关的函数
1,通过id函数,返回节点或关系的ID
MATCH (:Person { name: 'Oliver Stone' })-[r]->(movie)
RETURN id(r);
2,通过type函数,查询关系的类型
MATCH (:Person { name:'Oliver Stone'})-[r]->(movie)
RETURN type(r);
3,通过lables函数,查询节点的标签
MATCH (:Person { name:'Oliver Stone'})-[r]->(movie)
RETURN lables(movie);
4,通过keys函数,查看节点或关系的属性键
MATCH (a)
WHERE a.name ='Alice'RETURN keys(a)
5,通过properties()函数,查看节点或关系的属性
CREATE (p:Person { name:'Stefan', city:'Berlin' })
RETURN properties(p)
八. 路径查询
变长路径的模式
从一个节点,通过直接关系,连接到另外一个节点,这个过程叫遍历,经过的节点和关系的组合叫做路径(Path),路径是由节点和关系的有序组合。
(a)-->(b):是步长为1的路径,节点a和b之间有关系直接关联;
(a)-->()-->(b):是步长为2的路径,从节点a,经过两个关系和一个节点,到达节点b;
Cypher语言支持变长路径的模式,变长路径的表示方式是:[*N..M],N和M表示路径长度的最小值和最大值。
(a)-[*2]->(b):表示路径长度为2,起始节点是a,终止节点是b;
(a)-[*3..5]->(b):表示路径长度的最小值是3,最大值是5,起始节点是a,终止节点是b;
(a)-[*..5]->(b):表示路径长度的最大值是5,起始节点是a,终止节点是b;
(a)-[*3..]->(b):表示路径长度的最小值是3,起始节点是a,终止节点是b;
(a)-[*]->(b):表示不限制路径长度,起始节点是a,终止节点是b;
路径变量
路径可以指定(assign)给一个变量,该变量是路径变量,用于引用查询路径。
p = (a)-[*3..5]->(b)
例子:
MATCH (me)-[:KNOWS*1..2]-(remote_friend)
WHERE me.name = 'Filipa'
RETURN remote_friend.name
关系匹配
一,Return子句
二,with 子句
三,unwind子句
四,Where子句
五,排序
六,SKIP和LIMIT
一,节点查询
match 的基本使用
二,基本关系的查询
1,指定关系的方向来查询节点
2,查询关系的类型
3,匹配关系类型
3,匹配多种关系类型
4,匹配关系类型,并指定关系变量
5,匹配多个关系
三,匹配路径
1,对变长路径的查询
2,路径变量
3,根据路径的属性进行匹配
一,创建节点
1,创建空的节点
CREATE (n)
CREATE (a),(b)
2,创建带标签的节点
CREATE (n:Person)
CREATE (n:Person:Swedish)
3,创建带标签和属性的节点
CREATE (n:Person { name:'Andres', title:'Developer'})
二,创建关系
创建节点之前的关系
1,在两个节点之间创建关系
在两个节点之间创建关系,并设置关系类型
MATCH (a:Person),(b:Person)
WHERE a.name ='A'AND b.name ='B'CREATE (a)-[r:RELTYPE]->(b)
RETURN type(r)
2,创建关系,并设置关系的属性
MATCH (a:Person),(b:Person)
WHERE a.name ='A'AND b.name ='B'CREATE (a)-[r:RELTYPE { name: a.name +'<->'+ b.name }]->(b)
RETURN type(r), r.name
3,CREATE子句和模式
在CREATE子句和模式中,对于模式中的任意部分,如果它不存在于图中,那么CREATE子句创建它;如果存在于图中,那么就会引用它。
CREATE p =(andres { name:'Andres'})-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael { name:'Michael' })
RETURN p
三,删除节点和关系
使用delete子句删除节点、关系和路径,当删除节点时,该节点必须是孤立的节点,也就是说,必须首先删除跟节点相关的所有关系。
detach delete: 表示删除一个节点或多个节点,跟节点相关的所有关系也都被删除。
1,删除节点
MATCH (n:Person { name:'UNKNOWN' })
DELETE n
2,删除所有节点和关系
MATCH (n)
DETACH DELETE n
3,删除一个节点和它的所有关系
MATCH (n { name:'Andres' })
DETACH DELETE n
4,删除关系
MATCH (n { name:'Andres'})-[r:KNOWS]->()
DELETE r
四,更新属性或标签
set子句用于更新节点的标签,向节点和关系中添加属性
1,向节点或关系中添加属性
MATCH (n { name:'Andres' })
SET n.surname ='Taylor'RETURN n.name, n.surname
2,移除属性
如果设置属性的值是NULL,相当于把该属性从节点或关系中移除
MATCH (n { name:'Andres' })
SET n.name = NULL RETURN n.name, n.age
3,复制属性
把一个节点的属性复制给另一个节点
MATCH (at { name:'Andres'}),(pn { name:'Peter' })
SET at = pn
RETURN at.name, at.age, at.hungry, pn.name, pn.age
4,从Map中添加属性
MATCH (p { name:'Peter' })
SET p += { hungry: TRUE , position:'Entrepreneur'}
5,在一条set子句中添加多个属性
MATCH (n { name:'Andres' })
SET n.position ='Developer', n.surname ='Taylor'
6,向节点中添加标签
MATCH (n { name:'Stefan' })
SET n:German
RETURN n.name, labels(n) AS labels
7,向节点中添加多个标签
MATCH (n { name:'Emil' })
SET n:Swedish:Bossman
RETURN n.name, labels(n) AS labels
五,移除属性
使用remove子句从节点中移除标签和属性,从关系中移除属性。
1,移除属性
默认情况下,Neo4j不允许存在值为null的属性;如果属性不存在,那么返回该属性的值是null。
MATCH (a { name:'Andres' })
REMOVE a.age
RETURN a.name, a.age
2,移除节点的标签
MATCH (n { name:'Peter' })
REMOVE n:German
RETURN n.name, labels(n)
3,移除节点的多个标签
当节点的标签为空时,labels(n)函数返回空的list
MATCH (n { name:'Peter' })
REMOVE n:German:Swedish
RETURN n.name, labels(n)
六,foreach子句
列表和路径是Cypher中的关键概念,foreach子句用于更新数据,例如,对路径中的元素或通过聚合创建的列表执行更新命令。
1,对路径中的元素执行更新命令
对路径中匹配的所有节点,添加marked属性,并设置属性值为TRUE
MATCH p =(begin)-[*]->(END )
WHERE begin.name = 'A' AND END .name = 'D'
FOREACH (n IN nodes(p)| SET n.marked = TRUE )