问题总述:使用INSERT EDGE IF NOT EXITS 插入边,发现该语义失效,srcid+dsrid+edge type+rank的唯一性失效。
具体背景:
#创建人物TAG、推文TAG、人物->推文的边、边索引
CREATE TAG Person
( name
string NULL DEFAULT NULL COMMENT “姓名”, gender
int8 NULL DEFAULT NULL COMMENT “性别”, email
string NULL DEFAULT NULL COMMENT “邮箱”, mobilePhone
string NULL DEFAULT NULL COMMENT “电话”, industry
string NULL DEFAULT NULL COMMENT “行业”, jobTitle
string NULL DEFAULT NULL COMMENT “职位”, createTime
date NULL DEFAULT NULL COMMENT “创建时间”, jobCompanyName
string NULL DEFAULT NULL COMMENT “公司名称”) ttl_duration = 0, ttl_col = “”, comment = “人物”;
CREATE TAG Tweet
( ) ttl_duration = 0, ttl_col = “”, comment = “推特贴文”;
CREATE EDGE PersonTweetRelation
( createTime
date NULL DEFAULT NULL COMMENT “创建时间”) ttl_duration = 0, ttl_col = “”, comment = “人物-推特贴文”;
CREATE EDGE INDEX personTweet_edge_index_name
ON PersonTweetRelation
() comment “人物推文边索引”;
#插入点数据
INSERT VERTEX Person (name,gender, email,mobilePhone,industry,jobTitle,createTime,jobCompanyName) VALUES “59PPP”:(“Tom”, 1,"5951321@goo.com",“1594841346”,“IT”,“Cow&Horse”,date(“2021-03-12”),“Alibaba”);
INSERT VERTEX Tweet() VALUES “59TTT”:();
#第一次插入边数据,属性createTime为:datetime(“2011-11-11T11:11:11.111”)
INSERT EDGE IF NOT EXISTS PersonTweetRelation (createTime) VALUES “59PPP”->“59TTT”@0:(datetime(“2011-11-11T11:11:11.111”));
#查询边关系,分别从人物59PPP和推文TTT(都是双向)出发
GO FROM “59PPP” OVER PersonTweetRelation BIDIRECT YIELD edge as e;
GO FROM “59TTT” OVER PersonTweetRelation BIDIRECT YIELD edge as e;
显示的结果都是:[:PersonTweetRelation “59PPP”->“59TTT” @0 {createTime: 2011-11-11T11:11:11.111000}]
此时,一切正常。
#第二次插入边数据,属性createTime改为:datetime(“2022-02-02T22:22:22.222”)
INSERT EDGE IF NOT EXISTS PersonTweetRelation (createTime) VALUES “59PPP”->“59TTT”@0:(datetime(“2022-02-02T22:22:22.222”));
#再次查询边关系,分别从人物59PPP和推文TTT(都是双向)出发,此时结果发生了变化
GO FROM “59PPP” OVER PersonTweetRelation BIDIRECT YIELD edge as e;----->结果:[:PersonTweetRelation “59PPP”->“59TTT” @0 {createTime: 2011-11-11T11:11:11.111000}]
GO FROM “59TTT” OVER PersonTweetRelation BIDIRECT YIELD edge as e;----->结果:[:PersonTweetRelation “59PPP”->“59TTT” @0 {createTime: 2022-02-02T22:22:22.222000}]
至此,第一个问题出现,第二次插入的边数据,根据srcid+dsrid+edge type+rank的唯一性原理,应该不会插入库中,但实际上是成功插入的,在通过59TTT编历时能查出来。而此时,库中数据统计显示,仍只有1条边。
#第三次插入边数据,属性createTime改为:datetime(“2033-03-03T22:33:33.333”)
INSERT EDGE IF NOT EXISTS PersonTweetRelation (createTime) VALUES “59PPP”->“59TTT”@0:(datetime(“2033-03-03T22:33:33.333”));
#再次查询边关系,分别从人物59PPP和推文TTT(都是双向)出发,此时结果又发生了变化
GO FROM “59PPP” OVER PersonTweetRelation BIDIRECT YIELD edge as e;----->结果:[:PersonTweetRelation “59PPP”->“59TTT” @0 {createTime: 2011-11-11T11:11:11.111000}]
GO FROM “59TTT” OVER PersonTweetRelation BIDIRECT YIELD edge as e;----->结果:[:PersonTweetRelation “59PPP”->“59TTT” @0 {createTime: 2033-03-03T22:33:33.333000}]
至此,第二个问题出现,第三次插入的边数据,覆盖了第二次插入时“本不应该出现的边”。
如上所述,使用INSERT EDGE IF NOT EXITS 插入边,发现该语义失效,srcid+dsrid+edge type+rank的唯一性失效。请问有哪位前辈老师遇到过类似问题吗?