创建图
// 清空数据库中以往的图,确保一个空白的环境进行操作:
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);
查询过程
先看看建好的图的样子:
一阶查询
- 查询所有在Boston效力过的球员
match (a:Person) -[:Work_For]->(b:Location {city:"Boston"}) return a,b
- 查询哪两个城市的球队之间是“世仇”(rival)
match (a:Location)-[:Rival]->(b:Location) return a,b
- 查询所有在“东部联盟”(state==East)球队所在的城市效力过的球员
match (a:Person)-[:Work_For]->(b:Location{state:'East'}) return a,b
注:按理说查询“球员”,即Person,可以不用返回Location节点。此处若只要Person节点,则在return中可去掉b
- 查找所有“有关系存在”的节点(即有箭头向外指出)
match (a)-->(b) return a
如上图所示,比如“Memphis: Location”节点,由于没有箭头指出,所以没有在图中显示
二姐查询
- 查询球员Tatum朋友的朋友?
match (a:Person{name:"Tatum"})-[:Friends]->(b:Person)-[:Friends]->
(c:Person) return a,b,c
如上所示,Tatum有一个朋友(Anthony),Anthony又有一个朋友(Lillard)
- 查询球员Tatum朋友都效力过哪些球队?
match (a:Person{name:"Tatum"})-[:Friends]->(b:Person)-[:Work_For]->(c) return a,b,c
如上所示,Tatum有一个朋友(Anthony),Anthony共为Los Angeles、Denver和NewYork三座城市的球队效力过
多条件复和查询
- 查询在互为世仇的球队,都效力过的球员?(答案:Anthony,他在Los Angeles和Denver这对rival都有效力过)
match (p:Person)-[:Work_For]->(a:Location), (p)-[:Work_For]->(b:Location), (a)-[:Rival]-(b)
return p,a,b
如查询SQL所示,match中,将三个条件依次排开,用逗号链接即可。此外,由于其中一个条件为“互为Rival”即可,所以第三个条件(a)-[:Rival]-(b)
两边没有指向箭头,谁是谁的Rival都可
增删改查
- 新增节点和关系——略,见前面的图数据库创建过程
- 修改节点和关系:
- 修改节点属性:例,将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
- 删:删除Memphis的state属性
match (a:Location{city:'Memphis'}) remove a.state
- 删:直接删除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
,再删除节点即可