公司项目中需要展示多个主体之间的关系,直接查询数据库比较复杂。进过调研,发现图数据库可以满足需求。图数据库有很多种,比如百度的HugeGraph,Neo4j,本文先简单说一下一下Neo4j。
使用dicker安装neo4j,简单又迅速。
docker pull neo4j:4.2.1
docker run -d --name=neo4j --publish=7474:7474 --publish=7687:7687 -v $HOME/neo4j/data:/data neo4j:4.2.1
Cypher是neo4j图数据库的查询语言,类似于mysql的sql语句,但是它允许对图形进行富有表现力和有效的查询和更新
create命令
match命令
merge命令
relationship关系命令
where命令
delete命令
sort命令
字符串函数
聚合函数
index索引命令
2.1、create命令:创建图数据中的节点
创建命令格式
#此处create是关键字,创建节点名称node_name,节点标签node_label,放在小括号里面()
# 后面把所有属于节点标签的属性放在大括号‘{}’里,以此写出属性名,属性值,不同属性用逗号‘,’分割,
# 例如下面命令创建一个节点n,节点标签是Employee,拥有id,name,age三个属性
create (e:Employee{id:1,name:'Bob',age:23})
2.2、match命令:匹配(查询)已有数据
#match命令专门用来匹配查询,节点名称:节点标签,依然放在小括号内,然后使用return语句返回查询结果,和sql很相似
match (e:Employee) return e.name
查询某个顶点的关系有哪些定点
match(n:Employee)-[r:搭档]->(b:Employee) where n.name='Bob' return n,r,b
2.3、merge命令:
若节点存在,则等效于match命令;节点不存在,则等效于create命令
merge (e:Employee{id:1,name:'Bob',age:23})
2.4、使用create命令创建关系:
必须创建有方向性的关系,否则报错
create (p1:profile1)-[r:buy]-> (p2:profile2)
对已有的节点创建关系:
match(e1:Employee),(e2:Employee)where e1.name = 'Bob' and e2.name = 'Bob' create (e1)-[r:搭档{roles:'manage'}]-> (e2) return e1,r,e2
match(e1:Employee),(e2:Employee)where e1.name = 'Bob' and e2.name = 'Bob' create (e2)-[r:搭档啊{roles:'manage'}]-> (e1) return e1,r,e2
创建新的节点和关系:
create (Tom:Employee{id:3,name:'Tom',age:23})
create (Alice:Employee{id:4,name:'Alice',age:23})
create (Tom)-[r:同事{roles:'dept'}] ->(Alice)
2.5、使用merge创建关系:可以创建有/无方向的关系
merge(p1:profile1)-[r:miss]-(p2:profile2)
match(e1:Employee),(e2:Employee) where e1.name = 'Bob' and e2.name = 'Bob'
merge(e1)-[r:搭档{roles:'manage'}]- (e2) return e1,r,e2
2.6、where 命令:类似于sql中添加查询条件
根据自带的id查询
match (e:Employee) where ID(e) = 123 return e.name
根据自定义的id查询
match (e:Employee) where e.id = 123 return e.name
2.7、delete命令:删除节点/关系及其关联属性
match (p1:profile1)-[r]-(p2:profile2) delete p1,r,p2
match(e:Employee) where e.id = 123 delete e
删除已有关系的节点和关系
match(e:Employee)-[r]-(e2:Employee) where ID(e) = 173 delete e,r
删除节点之间的关系
match(e1)-[r]-(e2) where e1.name='Bob' and e2.name='Bob' delete r return r
删除节点的属性
MATCH (e:Employee) REMOVE e.id
2.8、sort命令:排序使用的是order by
match (e:Employee) return e.id,e.name order by e.id
2.9、字符串函数
toUpper() 转为大写
toLower() 转为小写
substring() 截取字符串
replace()
replace(e.name,e.name,e.name + ‘hello’)
原始字段,匹配,要替换的字符串
2.10、聚合函数
count()
max()
min()
sum()
avg()
2.11、创建索引和删除索引
create index on:Employee(id)
drop index on:Exployee(id)
2.12修改关系属性
match(e1)-[r]-(e2) where ID(e1) = 171 set r.des='小飞侠&大鲨鱼' return e1,r,e2
match(e1)-[r]-(e2) where ID(e1) = 171 set r.des='同事' return e1,r,e2
2.13、修改关系
match(n)-[r:搭档啊]->(m) create(n)-[r2:partner]->(m) set r2=r with r delete r
match(n)-[r:搭档]->(m) where ID(n) = 171 create(n)-[r2:partner]->(m) set r2=r with r delete r
2.13、创建和删除唯一性约束
CREATE CONSTRAINT ON (e:Employee) ASSERT e.name IS UNIQUE
DROP CONSTRAINT ON (e:Employee) ASSERT e.name IS UNIQUE