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

时间:2016-08-26 17:12:43

标签: java neo4j spring-data spring-data-neo4j spring-data-neo4j-4

让我们有这个类结构:

@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
}

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

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

我已经审核了this question(与SDN3相关),我认为它与我的用例非常接近,但似乎无法正常工作......

任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:8)

标签规则如下:

  • 层次结构中的任何普通具体类都默认生成标签
  • 普通抽象类默认情况下不生成标签
  • 普通界面默认情况下不会生成标签
  • 任何使用@NodeEntity或@NodeEntity(label =“something”)注释的类生成标签
  • 不得允许空或空标签
  • 不要持久化的类/层次结构必须使用@Transient
  • 进行注释

因此,如果从基类中删除摘要或添加@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}"

答案 1 :(得分:2)

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

如果我们想要允许SDN添加父标签类,我们需要向它们添加@NodeEntity

因此,对于此用例,如果我们将其添加到Ad类,

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

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

enter image description here