【问题标题】:Multiple Inheritance in orientdb vertex classes?orientdb顶点类中的多重继承?
【发布时间】:2016-11-23 20:54:13
【问题描述】:

我对 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 的多重继承模型中的一个错误吗? OrientDB 删除重复条目是否有意义,或者抛出错误并禁止创建类?

【问题讨论】:

  • 我想你可以在 github 上询问它是否是正确的行为

标签: orientdb


【解决方案1】:

从 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"

因此,保留一个属性;如果有多个超类,那么它们的公共属性也必须具有相同的数据类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2014-12-27
    • 2017-02-04
    • 2015-01-18
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多