Spring Data Neo4j 5节点/关系标签和继承

时间:2018-03-05 07:29:07

标签: neo4j cypher spring-data-neo4j neo4j-ogm spring-data-neo4j-5

我有以下Spring Data Neo4j 5实体:

@NodeEntity
public class Value extends Flaggable {

    @Index(unique = true)
    private Long id;

    private String name;

    private String description;

    @Index(unique = false)
    private Object value;

}

现在Value个节点有以下标签:

MATCH(n:Value) RETURN labels(n) LIMITS 1

["BaseEntity", "Subscribable", "Flaggable", "Likeable", "Value"]

在某些情况下,根据我的项目要求,我需要使用其他属性扩展Value节点,例如weightsize

我不想更改现有的Value类,并希望引入新的继承类,例如:

@NodeEntity
public class WeightedValue extends Value{

    private Long weight;

    private Long size;

}

我有一个问题,以下查询MATCH(n:Value) RETURN n是否还会返回WeightedValue的实例?

是否可以通过以下查询搜索WeightedValue个节点(按Value标签)?

MATCH(n:Value) WHERE n.size > 1000 RETURN n

上述方法是否适用于@RelationshipEntity和继承?因此可以使用@RelationshipEntity的继承以及如何为基类和继承类保留相同的标签(例如HAS_VALUE_ON),例如:

@RelationshipEntity(type = "HAS_VALUE_ON")
public class RelationshipValue {

    @Id
    @GeneratedValue
    private Long id;

    @StartNode
    private Decision decision;

    @EndNode
    private Characteristic characteristic;

}

@RelationshipEntity(type = "HAS_VALUE_ON")
public class WeightedRelationshipValue extends RelationshipValue {

    private Long weight;

    private Long size; 

}

1 个答案:

答案 0 :(得分:1)

对于问题的第一部分,由WeightedValue extends Value类创建的节点将同时具有ValueWeightedValue标签(您可以制作它,因此它没有超级类如果你想的话)。因此,只要所有WeightedValue个节点都是Value个节点,您就可以在MATCH个节点上Value

此外,在您的问题中,您询问Cypher MATCH查询是否有效,但我想确保您没有假设SDN可能会将您的存储库查询转入的幕后查询(即找到所有())。我完全不确定,但SDN可能会将诸如weightedValueRepo.findAll()之类的内容转换为类似的内容:MATCH (n:Value:WeightedValue) return n;在Cypher中,这将返回节点,从而返回其所有属性。但是,如果在Java中使用List<Value> values = valueRepo.findAll(),请记住,Value对象可能没有与WeightedValue对象相同的Java /类属性。

因此,在Cypher匹配/查询Value标签可以让您访问整个节点(包括仅在WeightedValue对象中定义的属性,通过SDN查找/匹配可能不会,因为OGM必须将节点的属性映射到一个类(并且该超类通常不具有与其子类相同的属性)。

对于第二部分,我认为单个Relationship只有一种类型,并且不像标签那样工作,其中一个实体可以有多个。但是,您可以在相同节点之间创建不同类型的多个关系。如果SDN会创建两个rel,我不确定是否@RelationshipEntity扩展另一个sample_text="value"。也许你可以尝试一下,让我知道。 :slightly_smiling_face: