Hibernate Neo4j 从一个 class 创建关系

Hibernate Neo4j create relationships from one class

我正在尝试使用 Hibernate 来存储家谱信息。从我在 documentation 中看到的情况来看,为了连接两个或多个实体,它们必须来自不同的 classes。所以,为了在夫妻之间建立关系,我需要分别有两个 classes。我认为这是没有意义的,因为两个 classes 是相同的(请记住,树可能非常大,所以我会有很多重复的 classes)。

有没有办法拥有一个 class,例如 Person 并仅从那个 class 建立连接?

此外,如果没有办法实现,我将如何连接兄弟姐妹,例如

(p:Sibling)-[:SIBLING_OF]->(k:Sibling)

他们什么时候会来自同一个 class 兄弟姐妹?

您可以使用 CYPHER 查询为相同的 class 实体创建关系 如下

Match(u:sibling{name:'abc'}),Match(p:sibling{name:'xyz'})
CREATE (u)-[:SIBLING_OF]-(p)

执行CYPHER查询可以找到here

您可以与相同 class 的实体建立关系,就像与不同 class 的实体建立关系一样。

您可以在 Hibernate OGM 项目源中找到映射示例: https://github.com/hibernate/hibernate-ogm/blob/5.2.0.Alpha1/core/src/test/java/org/hibernate/ogm/backendtck/associations/recursive/TreeNode.java

和真实的测试用例: https://github.com/hibernate/hibernate-ogm/blob/5.2.0.Alpha1/core/src/test/java/org/hibernate/ogm/backendtck/associations/recursive/RecursiveAssociationsTest.java

测试映射一个树结构,节点有一个父节点和许多子节点,实体的映射如下所示:

@Entity
public class TreeNode {

    @Id
    private String name;

    @ManyToOne
    private TreeNode parent;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent",
        cascade = CascadeType.ALL, orphanRemoval = true)
    private List<TreeNode> children = new ArrayList<TreeNode>( 3 );

    ...
}

注意: 根据您的需要,您可以使用本机查询创建关联,但我不推荐这样做。 Hibernate OGM 变得不知道这种关系并且可能会出现问题。