neo4j图创建和图查询语句实战——一阶二阶查询、复合查询、增删改查...

创建图

// 清空数据库中以往的图,确保一个空白的环境进行操作:
MATCH (n) DETACH DELETE n

######################## 创建过程 ########################
// 创建Person节点
create (a:Person{name:"Tatum"}) return a;
create (a:Person{name:"Lillard"}) return a;
create (a:Person{name:"Anthony"}) return a;
create (a:Person{name:"Conley"}) return a;
create (a:Person{name:"Brogdon"}) return a;
create (a:Person{name:"Rose"}) return a;

// 创建Location节点
create (a:Location{city:"Denver", state: "West"}) return a;
create (a:Location{city:"Boston", state: "East"}) return a;
create (a:Location{city:"New York", state: "East"}) return a;
create (a:Location{city:"Los Angeles", state: "West"}) return a;
create (a:Location{city:"Portland", state: "West"}) return a;
create (a:Location{city:"Memphis", state: "West"}) return a;

// 创建关系——Person与Person之间
match (a:Person{name:'Conley'}), (b:Person{name:'Brogdon'}) 
merge (a)-[:Friends]->(b);
match (a:Person{name:'Tatum'}), (b:Person{name:'Anthony'}) 
merge (a)-[:Friends]->(b);
match (a:Person{name:'Brogdon'}), (b:Person{name:'Tatum'}) 
merge (a)-[:Teamate]->(b);
match (a:Person{name:'Rose'}), (b:Person{name:'Lillard'}) 
merge (a)-[:Teacher]->(b);
match (a:Person{name:'Lillard'}), (b:Person{name:'Rose'}) 
merge (a)-[:Friends]->(b);
match (a:Person{name:'Anthony'}), (b:Person{name:'Lillard'}) 
merge (a)-[:Friends]->(b);
// 创建关系——Person与Location之间
match (a:Person{name:'Lillard'}), (b:Location{city:'Portland'}) 
merge (a)-[:Work_For]->(b);
match (a:Person{name:'Tatum'}), (b:Location{city:'Boston'}) 
merge (a)-[:Work_For]->(b);
match (a:Person{name:'Anthony'}), (b:Location{city:'New York'}) 
merge (a)-[:Work_For]->(b);
match (a:Person{name:'Anthony'}), (b:Location{city:'Denver'}) 
merge (a)-[:Work_For]->(b);
match (a:Person{name:'Anthony'}), (b:Location{city:'Los Angeles'}) 
merge (a)-[:Work_For]->(b);
match (a:Person{name:'Conley'}), (b:Location{city:'Memphis'}) 
merge (a)-[:Work_For]->(b);
match (a:Person{name:'Rose'}), (b:Location{city:'New York'}) 
merge (a)-[:Work_For]->(b);
match (a:Person{name:'Lillard'}), (b:Location{city:'Memphis'}) 
merge (a)-[:Born_IN]->(b);
match (a:Person{name:'Rose'}), (b:Location{city:'New York'}) 
merge (a)-[:Work_For]->(b);
match (a:Person{name:'Brogdon'}), (b:Location{city:'Boston'}) 
merge (a)-[:Work_For]->(b);
// 创建关系——Location与Location之间
match (a:Location{city:'Los Angeles'}), (b:Location{city:'Denver'}) 
merge (a)-[:Rival]->(b);
match (a:Location{city:'Boston'}), (b:Location{city:'New York'}) 
merge (a)-[:Rival]->(b);

查询过程

先看看建好的图的样子:
1.png

一阶查询

  1. 查询所有在Boston效力过的球员
match (a:Person) -[:Work_For]->(b:Location {city:"Boston"}) return a,b

2.png
3.png

  1. 查询哪两个城市的球队之间是“世仇”(rival)
match (a:Location)-[:Rival]->(b:Location) return a,b

4.png

  1. 查询所有在“东部联盟”(state==East)球队所在的城市效力过的球员
match (a:Person)-[:Work_For]->(b:Location{state:'East'}) return a,b

5.png
注:按理说查询“球员”,即Person,可以不用返回Location节点。此处若只要Person节点,则在return中可去掉b

  1. 查找所有“有关系存在”的节点(即有箭头向外指出)
match (a)-->(b) return a

6.png
如上图所示,比如“Memphis: Location”节点,由于没有箭头指出,所以没有在图中显示

二姐查询

  1. 查询球员Tatum朋友的朋友?
match (a:Person{name:"Tatum"})-[:Friends]->(b:Person)-[:Friends]->
(c:Person) return a,b,c

7.png
如上所示,Tatum有一个朋友(Anthony),Anthony又有一个朋友(Lillard)

  1. 查询球员Tatum朋友都效力过哪些球队?
match (a:Person{name:"Tatum"})-[:Friends]->(b:Person)-[:Work_For]->(c) return a,b,c

8.png

如上所示,Tatum有一个朋友(Anthony),Anthony共为Los Angeles、Denver和NewYork三座城市的球队效力过

多条件复和查询

  1. 查询在互为世仇的球队,都效力过的球员?(答案:Anthony,他在Los Angeles和Denver这对rival都有效力过)
match (p:Person)-[:Work_For]->(a:Location), (p)-[:Work_For]->(b:Location), (a)-[:Rival]-(b)
return p,a,b

9.png

如查询SQL所示,match中,将三个条件依次排开,用逗号链接即可。此外,由于其中一个条件为“互为Rival”即可,所以第三个条件(a)-[:Rival]-(b)两边没有指向箭头,谁是谁的Rival都可

增删改查

  1. 节点和关系——略,见前面的图数据库创建过程
  2. 节点和关系:
    • 修改节点属性:例,将Memphis的state属性改为“East”——即把孟菲斯的球队划去东部
     match (a:Location {city:'Memphis'}) Set a.state='East'
    
    • 修改关系:将Brogdon->Tatum的关系,从Teamate修改为Friend
      逻辑上来说,是先找到这两个Person节点的 关系,然后先删除、再新建
    MATCH (n:Person {name:"Brogdon"})-[r1:Teamate]->(m:Person {name:"Tatum"})
    CREATE (n)-[r2:Friends]->(m)
    SET r2 = r1
    WITH r1
    DELETE r1
    
    • 修改节点名称:将【Person】节点一律重命名为【Player】
    match (n:Person) remove n:Person set n:Player
    
  3. :删除Memphis的state属性
match (a:Location{city:'Memphis'}) remove a.state
  1. :直接删除Portland节点
match (a:Location{city:"Portland"}) DELETE a

然后我们获得此报错:Cannot delete node<10>, because it still has relationships. To delete this node, you must first delete its relationships.
该错误一望便知,因为该节点还有其他关系,所以不能直接删除节点。所以要删除该节点,需先删除关系Lillard-[:Work_For]->Portland,再删除节点即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_illusion_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值