如何在同一节点的houses标签中插入多条记录避免覆盖?
问题描述
假设有一个名为“houses”的Tag,用于记录用户名下的房产信息。当前执行
insert houses语句时,新插入的房产信息会覆盖原有记录。现需实现单用户拥有多套房产的需求,该Tag定义如下:CREATE TAG houses ( code string NOT NULL COMMENT "ID", name string NOT NULL COMMENT "Name", ... ... ) COMMENT = "house information";请问当单个用户ID对应多套房产时,应编写何种查询语句才能避免此前插入的记录被替换?
问题根源
在Nebula Graph中,同一个顶点(VID)下,同一种Tag只能存在一个实例。如果直接将用户ID作为VID挂载houses Tag,每次插入新的房产信息都会覆盖原有Tag实例,这是图数据库Tag的设计规则决定的。
解决方案
要实现单用户多套房产的需求,需调整数据模型,将用户与房产拆分为独立顶点,通过边关联两者:
1. 重新设计数据模型
-- 创建用户Tag,存储用户基础信息 CREATE TAG user ( user_id string NOT NULL COMMENT "用户ID", username string COMMENT "用户名" ) COMMENT = "用户信息"; -- 保留原houses Tag,每个房产作为独立顶点 CREATE TAG houses ( code string NOT NULL COMMENT "房产ID", name string NOT NULL COMMENT "房产名称", address string COMMENT "房产地址" -- 其他房产字段... ) COMMENT = "房产信息"; -- 创建关联边,表示用户拥有某套房产 CREATE EDGE owns () COMMENT = "用户拥有房产的关联关系";
2. 插入数据(避免覆盖)
-- 插入用户顶点(假设用户ID为u001) INSERT VERTEX user(user_id, username) VALUES "u001": ("u001", "张三"); -- 插入第一套房产顶点 INSERT VERTEX houses(code, name, address) VALUES "h001": ("h001", "XX小区1号楼", "XX市XX路1号"); -- 插入第二套房产顶点 INSERT VERTEX houses(code, name, address) VALUES "h002": ("h002", "YY小区2号楼", "YY市YY路2号"); -- 建立用户与房产的关联 INSERT EDGE owns() VALUES "u001"->"h001": (); INSERT EDGE owns() VALUES "u001"->"h002": ();
3. 查询用户的所有房产
-- 通过用户VID查询所有关联的房产信息 MATCH (u:user)-[e:owns]->(h:houses) WHERE id(u) == "u001" RETURN id(u) AS user_id, u.username, id(h) AS house_id, h.code, h.name, h.address;
备选方案(不调整模型的折中方式)
如果无法修改现有模型,可以将房产信息存储为列表类型字段,但这种方式不利于后续对单套房产的独立查询和更新:
-- 修改houses Tag,新增多房产列表字段 ALTER TAG houses ADD properties ( house_list list<map<string, string>> NOT NULL COMMENT "多套房产列表" ); -- 插入/更新时合并新旧房产信息 INSERT VERTEX houses(house_list) VALUES "u001": ([ {"code": "h001", "name": "XX小区1号楼"}, {"code": "h002", "name": "YY小区2号楼"} ]);
注意:这种方式仅适合简单场景,复杂业务推荐使用「顶点+边」的关联模型。
内容的提问来源于stack exchange,提问作者myrtleDuncan
相关产品推荐
相关产品推荐

