2

让我们有这样的阶级结构:第二标签添加到继承的节点弹簧数据的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 
} 

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

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

我查看this question(与SDN3),我认为这是非常接近我的使用情况,但它似乎没有工作...

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

回答

6

用于标签的规则如下:

  • 层次结构中的任何普通混凝土类生成默认标签
  • 纯抽象类默认不
  • 生成标签
  • 纯文本界面默认不生成标签
  • 任何用@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}" 
+0

感谢有关标签说明的详细规则。 – troig

+0

不客气@troig :)让我们知道如果你有任何问题获得2.0.4/5集成。 –

2

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

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

因此,对于这种使用情况下,如果我们把它添加到Ad类,

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

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

enter image description here