Neo4j 学习笔记1
初学者,项目暂时用不到,纯粹为了好奇。
Cypher语句:
(1)创建节点:
create (p:person{name:"贾宝玉",sex:"男",age:"16",hobby:"女孩子"}) create (p:person{name:"林黛玉",sex:"女",age:"14",hobby:"葬花"}) create (p:person{name:"贾政",sex:"男",age:34,hobby:"装正经",prof:"工部员外郎"})
(2) 查询节点
match (p1:person{name:"贾宝玉"}),(p2:person{name:"贾政"}) return p1,p2
//根据id 查找节点 match (p1:person) where id(p1)=20 return p1
删除节点:
//删除全部person标签节点
match (person) delete m
(3) 创建关系
match (p1:person{name:"贾宝玉"}),(p2:person{name:"贾政"}) create (p1)-[r:SON]->(p2) return p1,p2
感觉方向有点别扭,需要删除关系,重新创建
(4) 删除关系
//删除所有关系为SON的关系 match p=()-[r:SON]->() delete r //删除两个节点之间的关系 match (n1:person),(n2:person) where n1.name="贾宝玉" AND n2.name="贾政" optional match (n1)-[r]-(n2) delete r //删除两个节点之间的指定关系 match (p1),(p2) where p1.name="贾宝玉" and p2.name="贾政" optional match (p1)-[r:SON]-(p2) delete r //删除某个节点所有关系(方向不影响) match (p1:person{name:"贾政"})-[r]-() delete r match (p1:person{name:"贾宝玉"})-[r]-() delete r //删除节点和节点所有关系 match (p1:person{name:"贾宝玉"})-[r]-() delete p1,r //删除所有拥有关系的节点和关系(注意:无关系节点不会删除) match (m:person)-[r]-() delete m,r //删除所有节点,(注意:删除节点时,如果该节点有关系,必须先删除关系才可以删除节点,否则报错) match (m:person) delete m
重新创建:
match (p1:person{name:"贾宝玉"}),(p2:person{name:"贾政"}) create (p1)-[r:父亲]->(p2) return p1,p2 match (p1:person{name:"贾宝玉"}),(p2:person{name:"林黛玉"}) create (p1)-[r:表妹]->(p2) return p1,p2 match (p1:person{name:"贾政"}),(p2:person{name:"林黛玉"}) create (p1)-[r:外甥女]->(p2) return p1,p2 match (p1:person{name:"贾政"}),(p2:person{name:"贾宝玉"}) create (p1)-[r:儿子]->(p2) return p1,p2 match (p1:person{name:"林黛玉"}),(p2:person{name:"贾宝玉"}) create (p1)-[r:表哥]->(p2) return p1,p2 match (p1:person{name:"林黛玉"}),(p2:person{name:"贾政"}) create (p1)-[r:舅舅]->(p2) return p1,p2
(4)merge :有则返回,没有创建,而create 不管有没,都创建
match (p1:person{name:"贾宝玉"}),(p2:person{name:"贾政"}) merge (p1)-[r:怕]->(p2) return p1,p2
match (p1:person{name:"贾宝玉"}),(p2:person{name:"贾政"}) merge (p1)-[r:父亲]->(p2) return p1,p2
(5) 更新标签:
match (p1:person) where id(p1)=20 set p1:female return p1 match (p1:person) where id(p1)=0 or id(p1)=21 set p1:male return p1
更新属性,给黛玉添加性格特征:
match (p1:person) where p1.name="林黛玉" set p1.character="多愁善感,说话尖酸,小嫉妒" return p1
添加两条黛玉、宝玉互喜欢关系
match (p1:person{name:"林黛玉"}),(p2:person{name:"贾宝玉"}) create (p1)-[r:喜欢]->(p2) return p1,p2 match (p1:person{name:"林黛玉"}),(p2:person{name:"贾宝玉"}) create (p2)-[r:喜欢]->(p1) return p1,p2
给关系添加属性,如desc
match (p1),(p2) where p1.name="林黛玉" and p2.name="贾宝玉" optional match (p1)-[r:喜欢]-(p2) set r.desc="痴情" return p1,p2 match (p1),(p2) where p1.name="林黛玉" and p2.name="贾宝玉" optional match (p2)-[r:喜欢]-(p1) set r.desc="多情" return p1,p2
注意:这里没有箭头,所以两条喜欢的关系描述最终都是多情。
match (p1),(p2) where p1.name="林黛玉" and p2.name="贾宝玉" optional match (p1)-[r:喜欢]->(p2) set r.desc="痴情" return p1,p2 match (p1),(p2) where p1.name="林黛玉" and p2.name="贾宝玉" optional match (p2)-[r:喜欢]->(p1) set r.desc="多情" return p1,p2
(6)索引:
创建语法:create index on :<标签名> (属性名)
create index on :person(name)
删除语法:drop index on :<标签名> (属性名)
drop index on :person(name)
创建唯一约束索引
create constraint on(p:person) assert(p.name) is unique
删除唯一约束索引
drop constraint on(p:person) assert(p.name) is unique
(7) 多维度关系查询
查询之前,需要造点数据:Neo4j 3.4.4之后支持浏览器创建多条语句
create (m:mobile{no:"15171052716",brand:"华为"}); create (m:mobile{no:"18771054371",brand:"小米"}); create (m:mobile{no:"13287562316",brand:"oppo"}); match (p1:person),(m1:mobile) where p1.name="贾宝玉" and m1.no="18771054371" create (p1)-[r:拥有]->(m1) return p1,m1; match (p1:person),(m1:mobile) where p1.name="林黛玉" and m1.no="13287562316" create (p1)-[r:拥有]->(m1) return p1,m1; match (p1:person),(m1:mobile) where p1.name="贾政" and m1.no="15171052716" create (p1)-[r:拥有]->(m1) return p1,m1; match (m1:mobile),(m2:mobile) where m1.no="13287562316" and m2.no="18771054371" create (m1)-[r:Call{count:40}]->(m2) return m1,m2; match (m1:mobile),(m2:mobile) where m1.no="13287562316" and m2.no="18771054371" create (m2)-[r:Call{count:20}]->(m1) return m1,m2; match (m1:mobile),(m2:mobile) where m1.no="15171052716" and m2.no="18771054371" create (m1)-[r:Call{count:5}]->(m2) return m1,m2;
结果:
查询1:注意:关系无箭头
match (p:person)-[r1:`拥有`]->(m1:mobile)-[r2:Call]-(m2:mobile) where p.name="贾宝玉" return p,m1,m2 limit 4
查询2:注意关系有箭头
match (p:person)-[r1:`拥有`]->(m1:mobile)-[r2:Call]->(m2:mobile)-[r3:`拥有`]-(p2:person) where p.name="贾宝玉" return p,m1,m2,p2 limit 10
如果不指定关系,直接用 []
查询3:利用关系查询
match (p:person)-[r:`怕`]->() return p
查询4:正则查询 (注意时.*号)
match (p1:person) where p1.name=~'贾.*' return p1 limit 10
查询5:包含查询
match (p1:person) where p1.name contains '贾' return p1 limit 10