Fork me on GitHub

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

 

posted @ 2020-02-13 16:51  小传风  阅读(289)  评论(0编辑  收藏  举报