类 必须在记录插入之前存在吗?

Do classes necessarily have to exist prior to record insertion?

我来自 Neo4j 并正在评估 OrientDB,我有一个关于 classes 的快速问题 - 在插入记录之前它们是否必须存在?也就是说,在 Neo4j 中有 'MERGE' 命令,如果节点不存在,它将更新或创建一个节点。 类 看起来大致相当于 Neo4j 的标签,如果在执行 MERGE 时标签不存在,则会创建它。 OrientDB 中是否有类似的功能?当前,当我尝试插入 class 不存在的记录时,OrientDB 抛出异常 "Class SOME_CLASS not found in database"。

我一直在通读文档,试图掌握各种可用的数据模型,但我找不到关于此问题的任何明确说明。我尝试的一件事是添加一个集群,然后插入一个 class 不存在的记录。这行得通,在 OrientDB Studio 中,在 'DB' 下,我看到集群的记录数等于“1”;但是,该新记录的 class 不会出现在 'Schema' 下。

如果无法动态 class 创建此类,是否可以检查架构中是否存在 class,如果不存在,则创建它,然后继续创建记录?另一个问题是,如果可以接受,这样做好吗,还是我应该始终手动定义模式?

如果您使用 CREATE 命令之一,则对象将放置在默认 class 中;例如:

CREATE VERTEX
Created vertex 'V#9:0 v1' in 0.047000 sec(s).

(在这种情况下,class 是 V。)

当然,如果您使用 INSERT INTO ... 形式,则必须指定 class。

所以也许您的第一个问题归结为是否可以更改 OrientDB 顶点或边的 class。

可以更改顶点的父 class -- 请参阅 http://orientdb.com/docs/2.1/SQL-Move-Vertex.html -- 但有一些重要的注意事项。

要以编程方式测试 class 是否存在,请参见例如这个 SO 条目: Check if class exists or not in orientdb

这给出了一个 Java 示例,但使用其他支持的语言也可以采用类似的方法。

至于动态更改实体 class 的智慧——也许安全的答案是,如果您可以使用 属性 标签实现任何您想要的,那么就使用标签。