如何防止OrientDB中相同顶点间创建重复边?分场景需求问询
解决OrientDB中Knows边重复、Visited边允许多实例的问题
嘿,我刚好碰到过类似的OrientDB边重复的问题,给你捋捋怎么精准解决两种边的不同需求!
核心思路
你需要给Knows边添加out+in的组合唯一索引,强制同一出顶点到入顶点只能存在一条Knows边;而Visited边因为带有date属性,允许多条重复(仅顶点对重复但date不同),所以不需要唯一约束,反而可以加组合索引优化查询。
1. 给Knows边创建唯一组合索引
直接执行以下SQL,创建基于out(出发顶点)和in(到达顶点)的唯一索引,这样就能阻止重复的John→Ann Knows边被创建:
CREATE INDEX Knows.out_in ON Knows (out, in) UNIQUE
注意:如果你的数据库里已经存在重复的Knows边,得先删除冗余数据再创建索引,否则会因为违反唯一约束创建失败。
2. 清理已存在的重复Knows边(如果有)
如果之前不小心创建了多条John→Ann的Knows边,可以用这条SQL保留每组顶点对的第一条边,删除其余重复项:
DELETE EDGE Knows WHERE out IN (SELECT FROM Person WHERE name = 'John') AND in IN (SELECT FROM Person WHERE name = 'Ann') AND @rid NOT IN (SELECT MIN(@rid) FROM Knows GROUP BY out, in)
3. 验证Knows边的唯一约束
现在尝试再次创建John→Ann的Knows边:
CREATE EDGE Knows FROM (SELECT FROM Person WHERE name = 'John') TO (SELECT FROM Person WHERE name = 'Ann')
OrientDB会直接抛出唯一约束违反的错误,阻止重复边生成,完美解决冗余问题!
4. Visited边的优化(可选)
对于Visited边,因为我们需要允许多条(比如John在不同日期访问纽约),不需要唯一索引,但可以创建out+in+date的组合非唯一索引来加速查询:
CREATE INDEX Visited.out_in_date ON Visited (out, in, date) NOTUNIQUE
这个索引能让你快速查询“John在2024-05-01是否访问过纽约”这类需求,同时完全不限制同顶点对的多条边存在。
这样就能完美区分两种边的需求啦,既避免Knows边的冗余,又保留Visited边的多实例特性~
内容的提问来源于stack exchange,提问作者Xylian
相关产品推荐
相关产品推荐

