图数据库操作与查询示例
1. 图空间的创建与克隆
在图数据库中,图空间是存储图数据的容器。以下是创建和克隆图空间的示例:
# 创建图空间
CREATE SPACE test_Nebula(partition_num=15, replica_factor=1, vid_type=fixed_string(30));
# 克隆图空间
CREATE SPACE IF NOT EXISTS monitor_rules_orderby AS monitor_rules;
2. 选择图空间
在进行数据操作前,需要选择一个图空间:
USE test_Nebula;
3. 创建Tag和Edge Type
在图数据库中,Tag代表顶点的属性集合,Edge Type代表边的类型和属性:
CREATE TAG player(name string, age int);
CREATE TAG team(name string);
CREATE EDGE follow(degree int);
CREATE EDGE serve(start_year int, end_year int);
4. 修改点和边
可以对已存在的边添加新的属性:
ALTER EDGE follow ADD (seq int);
5. 插入数据
插入顶点和边的数据:
INSERT VERTEX player(name, age) VALUES "player100":("Tim Duncan", 42);
INSERT VERTEX player(name, age) VALUES "player101":("Tony Parker", 36);
INSERT VERTEX player(name, age) VALUES "player102":("LaMarcus Aldridge", 33);
INSERT VERTEX team(name) VALUES "team203":("Trail Blazers"), "team204":("Spurs");
INSERT EDGE follow(degree) VALUES "player101" -> "player100":(95);
INSERT EDGE follow(degree) VALUES "player101" -> "player102":(90);
INSERT EDGE follow(degree) VALUES "player102" -> "player100":(75);
INSERT EDGE serve(start_year, end_year) VALUES "player101" -> "team204":(1999,2018), "player102" -> "team203":(2006,2015);
6. 查询
go语句
使用go
语句可以进行图遍历:
# 从VID为player101的球员开始,沿着follow找到链接的球员
GO FROM "player101" OVER follow YIELD id($$);
# 从VID为player101的球员开始,沿着边follow查找年龄大于或者等于35岁的球员,并返回他们的姓名和年龄
GO FROM "player101" OVER follow WHERE properties($$).age >= 35 YIELD properties($$).name AS Teammate, properties($$).age AS Age;
fetch语句
使用fetch
语句可以获取顶点的属性:
FETCH PROP ON player "player100" YIELD properties(vertex);
MATCH语句
MATCH
语句用于执行复杂的图查询:
# 查询所有边
MATCH ()-[e]->() RETURN e;
示例查询
以下是一些基于图数据库的查询示例:
示例1:查询所有球队及其关联的球员
MATCH (t:team)<-[:serve]-(p:player)
RETURN t.name AS team_name, collect(p.name) AS players;
示例2:查找所有球员及其所属的球队
MATCH (p:player)-[:serve]->(t:team)
RETURN p.name AS player_name, collect(t.name) AS teams;
示例3:查询特定球员服务过的所有球队
MATCH (p:player {name: '特定球员姓名'})-[:serve*]->(t:team)
RETURN t.name AS team_name;
示例4:查询与特定球员相互关注的其他球员
MATCH (p1:player)-[:follow*2]->(p2:player)
WHERE p1.name = '特定球员姓名'
RETURN p2.name AS followed_player;
示例5:查询所有球员的年龄分布
MATCH (p:player)
RETURN p.age AS age, count(*) AS player_count
ORDER BY age;
示例6:查询服务年限超过10年的球员及其球队
MATCH (p:player)-[:serve]->(t:team)
WHERE (p.end_year - p.start_year) > 10
RETURN p.name AS player_name, t.name AS team_name;
更新与删除数据
除了查询,我们还可以更新和删除图数据库中的数据:
UPDATE VERTEX "player100" SET player.name = "Tim";
UPDATE EDGE ON follow "player101" -> "player100" SET degree = 96;
DELETE VERTEX "player111", "team203";
DELETE EDGE follow "player101" -> "team204";
通过上述操作,我们可以看到图数据库在处理关系数据方面的强大能力。无论是社交网络分析、推荐系统还是其他需要复杂关系查询的场景,图数据库都能提供高效的解决方案。