超类中的通用关系

Generic relations in superclass

我正在使用 Spring Data Neo4j 将 Java 实体写入 Neo4j 数据库。对象模型相当通用:

public abstract class AbstractNode {
     @GraphId
     private Long id;

     @Index(primary = true, unique = true)
     private String uuid;

     @Relationship(type = "CONTAINS")
     private Set<AbstractNode> containsNode;

     ...
}

@NodeEntity
public class Country extends AbstractNode { ... }

@NodeEntity
public class Region extends AbstractNode { ... }

@NodeEntity
public class City extends AbstractNode { ... }

我正在创建 1 个国家/地区。我在这个国家/地区放置了 1 个区域,在区域中放置了 1 个城市。之后,我调用 Neo4jRepository.save(country)(当然是在我自己的继承自 Neo4jRepository 的接口上)使整个图持久化:

Country -> Region -> City

在 Neo4j Embedded 的日志中,我可以看到持久化了 1 个国家、1 个地区和 1 个城市。

现在我在新会话中加载国家/地区。结果是 1 个国家和 1 个地区。但是该地区不包含城市但包含国家/地区:

Country -> Region -> Country

如何持久化此类通用对象图?

您还需要用 @RelationshipcontainsNode 注释 setter:

// direction defaults to OUTGOING, using it here just for clarity
@Relationship(type = "CONTAINS", direction = "OUTGOING") 
public void setContainsNode(Set<AbstractNode> containsNode) {
    this.containsNode = containsNode;
}

如果您不这样做,OGM/SDN 会尝试匹配来自国家/地区的区域传入 CONTAINS 关系,并找到匹配类型的 setter 并使用它。在 setter 上使用 @Relationship 表示这应该仅用于 OUTGOING 并且对象比映射正确。