我对 OrientDB 中的多重继承很好奇...假设我创建了以下顶点类:
CREATE CLASS A EXTENDS V
CREATE PROPERTY A.label STRING
CREATE CLASS B EXTENDS A
CREATE PROPERTY B.foo STRING
CREATE CLASS C EXTENDS A
CREATE PROPERTY C.bar STRING
B 类和 C 类继承了 A 的属性...所以如果我创建一个同时继承 B 和 C 的新类:
CREATE CLASS D EXTENDS B,C
我得到了一个具有以下属性的 D 类:
D.label
D.label
D.foo
D.bar
OrientDB 让这种情况发生而没有任何提示,但我不确定在查询中如何区分一个“标签”属性与另一个属性。
如果我尝试直接创建一个与现有属性同名的新属性,例如:
CREATE PROPERTY C.label STRING
我会得到一个错误,因为该属性已经存在。
那么,这是不是OrientDB多继承模型的bug? OrientDB 删除重复条目或抛出错误并禁止创建类是否有意义?
最佳答案
从 3.x 开始,如果多个类在继承层次结构中具有相同的属性,则 OrientDB 的多重继承保留一个属性。例如:
create class yClass
create property yClass.groupId STRING (MANDATRY TRUE)
create class zClass
create property zClass.groupId STRING (MANDATORY TRUE)
create class aClass extends yclass,zClass
aClass 有一个属性 'groupId'(UI 可能显示 2 位实际上有一个)
以上可以验证:
create class yClass
create property yClass.groupId STRING (MANDATRY TRUE)
create class zClass
create property zClass.groupId INTEGER (MANDATORY TRUE)
create class aClass extends yclass,zClass
这会导致错误。
com.orientechnologies.orient.core.exception.OSchemaException: Properties conflict detected: 'groupId (type=STRING)] vs [groupId (type=INTEGER)] DB name="testclient_com_GDB"
因此,保留一个属性;如果有多个父类(super class),那么它们的公共(public)属性也必须具有相同的数据类型。
关于orientdb - orientdb 顶点类中的多重继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40773989/