我怀疑这是一个严重的错误,并且对OrientDB如何在各种DML操作期间管理图形数据的完整性提出了怀疑。
一个 Edge 如何具有多个 TO?
下面概述了使用"插入到选择"来复制顶点的简单操作。
初始状态
{
"result": [
{
"@type": "d",
"@rid": "#-2:1",
"@version": 0,
"rid": "#133:46",
"version": 1,
"class": "RuleSet",
"out_HasRule": [
"#80:32"
],
"@fieldTypes": "rid=x,out_HasRule=g"
},
{
"@type": "d",
"@rid": "#-2:2",
"@version": 0,
"rid": "#130:39",
"version": 1,
"class": "Rule",
"in_HasRule": [
"#80:32"
],
"@fieldTypes": "rid=x,in_HasRule=g"
}
],
"notification": "Query executed in 0.213 sec. Returned 2 record(s)" }
如果我执行以下操作,则会创建错误的边缘数据。请注意,#80:32 是多个顶点的 IN。
insert into Rule from select * from #130:39;
{
"result": [
{
"@type": "d",
"@rid": "#-2:1",
"@version": 0,
"rid": "#133:46",
"version": 1,
"class": "RuleSet",
"out_HasRule": [
"#80:32"
],
"@fieldTypes": "rid=x,out_HasRule=g"
},
{
"@type": "d",
"@rid": "#-2:2",
"@version": 0,
"rid": "#131:38",
"version": 1,
"class": "Rule",
"in_HasRule": [
"#80:32"
],
"@fieldTypes": "rid=x,in_HasRule=g"
},
{
"@type": "d",
"@rid": "#-2:3",
"@version": 0,
"rid": "#130:39",
"version": 1,
"class": "Rule",
"in_HasRule": [
"#80:32"
],
"@fieldTypes": "rid=x,in_HasRule=g"
}
],
"notification": "Query executed in 0.151 sec. Returned 3 record(s)"}
是的,INSERT/SELECT 旨在复制文档,而不是顶点,因此它也复制边缘指针。
我认为值得通过以下两种方式之一修复它:
- 删除边缘链接
- 同时复制边缘
你能在这里打开一个问题吗:https://github.com/orientechnologies/orientdb/issues讨论会更容易讨论
谢谢路易吉!
这个问题是我们期望从任何数据库获得的核心,即数据完整性,所以我希望这个问题能成为堆栈的顶部。
问题已在此处打开 -> https://github.com/orientechnologies/orientdb/issues/7826