【问题标题】:OrientDB: Is it possible to define a vertex which is instance of multiple classes?OrientDB:是否可以定义一个顶点作为多个类的实例?
【发布时间】:2015-10-12 15:10:29
【问题描述】:

我正在尝试使用 OrientDB,我想为非析取继承建模。例如: - 有人 - 学生就是一个人 - 工人是一个人 - “阿尔贝托”既是学生又是工人。 是否可以仅使用我定义的三个类(Student、Worker、Person)来模拟这种情况,或者我应该引入一个新类 WorkingStudent,扩展 Worker 和 Student,包含“Alberto”?

我想一个顶点不能是多个类的实例,因为系统不知道将它放在哪个集群中,但我还没有找到我的问题的明确答案。

干杯,

阿尔贝托(在职学生:-))

【问题讨论】:

    标签: multiple-inheritance orientdb


    【解决方案1】:

    我认为您可能试图以错误的方式解决此问题。例如,Alberto 可能永远是一个人。但是当阿尔贝托毕业时,他将不再是学生。事实上,他也可能失去工作,不再是工人。将他从一个班级转移到另一个班级是一个相当大的问题。

    我会创建独立的、更小的 Worker 和 Student 节点。然后创建从 Person 到 Worker 或 Person 到 Student 的边。边可以命名为“Is A”。

    现在,添加新类别非常容易,例如“父母”或“配偶”,而不必担心更改您的类继承。

    图形数据库的一大优势...

    【讨论】:

    • 我明白你的意思,@silverfox1948。谢谢。但是,就像那样,我不能在模式级别施加任何约束,例如,我不能强加工人必须有薪水。显然这只是我编造的一个例子。在我正在构建的真实数据库中,父类的成员可以有多个子类但不能更改它们。
    • 实际上,如果“Worker”是一个节点(Vertex),那么可以对节点的属性创建约束。属性可以具有“强制”约束 - 意味着它是必需的,以及最小值/最大值。
    • 我强烈建议您不要使用继承来解决分类问题。工人/学生等只是暂时的、非排他性的类别。如果您添加另一个类别,您的继承需求将呈指​​数级增长。只需尝试再添加一个类别,看看您现在必须创建多少个子类,才能将一个人归类为新的可能组合之一。
    • 我现在已经明白你的第一个答案是什么意思了。看起来很优雅,我会尝试实现它。谢谢!
    【解决方案2】:

    在 OrientDb 中,一个顶点可以是多个类的实例。 使用这个命令

    create class WorkingStudent extends Working,Student
    

    亲切的问候。

    【讨论】:

    • 您好亚历山德罗,感谢您的回答。我实际上想知道是否可以在不创建新班级的情况下模拟一个在职学生。在 neo4j 中,我会写如下内容:CREATE (alberto: Student :Worker :Person {name: "alberto"})
    • 不,你不能这样做。在 Neo4j 中你只有标签,而在 OrientDB 中你有类层次结构、多态性等等,所以你必须在数据库模式上定义类层次结构
    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多