我使用OrientDB绘制社交网络图。顶点由user_id
唯一索引。插入新顶点时,我可能会遇到潜在的重复。例如,user_id(1)
有朋友:user_id(0)
... user_id(5)
... user_id(n)
。同一个用户1
也可能有相交的关注者,例如,user_id(5)
可能同时属于friends
和followers
。
因此,我插入root用户顶点,然后获取所有ID的朋友以及ID的关注者,然后将其插入批处理操作中。
我的问题是,在插入顶点时,是否存在一种规范方法来插入会占重复项的新记录?
鉴于我的应用程序的结构,我可以想到几种方法:
1)使用以下内容创建每个新用户顶点:
create vertex User content {user_node}
在每次插入之前,我会针对Redis数据库中包含的二级索引检查user_id
。我使用@rid
字段来创建边缘。 Redis商店包含一个包含字段user_id
和值@rid
的哈希索引,因此我可以通过这种方式填充@rid
。
这样可以保持OrientDB访问权限。此外,访问Redis可能比访问OrientDB快得多,获取哈希字段值的时间复杂度为O(1);因此,我想,即使我每次操作都要查询两个数据库,我仍然会提前(也许)。但是,如果OrientDB和二级索引之间存在分歧,则重复记录会引发ORecordDuplicatedException
。我可以在应用程序级别捕获此异常,但后来我遇到了@rid
个问题。我正在使用@rid
字段,因为根据OrientDB文档,这是访问记录的最快方式。
2)每次插入更新/ Upsert:
update User content {user_node} upsert where user_id = 1
我认为,这将在数据库端保留所有错误捕获和重复检测。来自Neo4j,MERGE
这样的操作比CREATE
贵一点;这同样适用于OrientDB吗?
我还缺少其他任何插入方法吗?这里有最好的解决方案吗?谢谢!