2

我有以下 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; 

}
4

1 回答 1

1

对于您问题的第一部分,由WeightedValue extends Value类创建的节点将同时具有ValueWeightedValue标签(您可以制作它,这样如果您愿意,它就没有超类)。所以,只要所有WeightedValue节点都是Value节点,那么你就可以MATCHValue节点上。

此外,在您的问题中,您询问 CypherMATCH查询是否有效,但我想确保您没有假设 SDN 可能会将您的存储库查询转换为的幕后查询(即 findAll())。我完全不确定,但 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我相信一个单一的只有一个类型,并且不像标签那样工作,一个实体可以有多个。但是,您可以在相同节点之间创建多个不同类型的关系。@RelationshipEntity如果SDN会创建两个rels,我不确定是否扩展另一个。也许你可以试试并告诉我。:slightly_smiling_face:

于 2018-03-11T09:49:00.117 回答