向 spring-data-neo4j-4 中的继承节点添加第二个标签

Add a second label to an inherited node in spring-data-neo4j-4

让我们有这个 class 结构:

@NodeEntity
abstract class BasicNodeEntity {
    @GraphId
    private Long nodeId;
    //...
}

abstract class IdentifiableEntity extends BasicNodeEntity {
    private String id;
    //...
}

abstract class Ad extends IdentifiableEntity {
    //... Ad attibutes
}

class OfferAd extends Ad {
    // ... OfferAd attibutes
}

通过 Neo4jRepository 保存一个 OfferAd 节点,我希望该节点有两个标签:OfferAdAd(继承)。但是,标签 Ad 没有添加到节点。

我知道我可以通过密码查询来保存节点,但我想知道是否可以通过 Neo4jRepository 代替。

我已经查看了 (与 SDN3 相关),我认为它非常接近我的用例,但它似乎不起作用...

如有任何帮助,我们将不胜感激。谢谢

就像将 @NodeEntity 注释添加到 Ad class 一样简单。 似乎 spring-data-neo4j-4 默认情况下只为每个节点创建一个标签,即使该节点继承了另一个标签。

如果我们想让SDN也添加父标签classes,我们需要给它们添加@NodeEntity

所以,对于这个用例,如果我们将它添加到 Ad class,

@NodeEntity
abstract class Ad extends IdentifiableEntity {
   //... Ad attibutes
}

当我们通过 Neo4jRepository 保存 OfferAd 时,创建的节点将具有两个标签:AdOfferAd

标签规则如下:

  • 层次结构中的任何普通混凝土class默认生成一个标签
  • 普通摘要class默认不生成标签
  • 普通界面默认不生成标签
  • 任何用@NodeEntity 或@NodeEntity(label="something") 注释的class 生成一个标签
  • 不得使用空标签或空标签
  • classes / 不被持久化的层级必须用@Transient注解

因此,如果您从基础 class 中删除摘要,或添加 @NodeEntity 注释,您应该会看到预期的结果。

此外(OGM 2.0.4 中的新增功能和 2.0.5 中的修复),您可以通过创建 Collection<String> 类型的字段并使用 @Labels 对其进行注释来添加和删除其他标签,例如示例:

@Labels
private List<String> labels = new ArrayList<>();

要使用版本 2.0.4 (gradle):

compile "org.neo4j:neo4j-ogm-core:{version}"
compile "org.neo4j:neo4j-ogm-http-driver:{version}"