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

3
我有一个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的实例?

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

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个回答

1
对于您问题的第一部分,由WeightedValue extends Value类创建的节点将同时具有ValueWeightedValue标签(如果您愿意,可以使其不具有超类)。因此,只要所有WeightedValue节点都是Value节点,那么您就可以在Value节点上进行MATCH
另外,在您的问题中,您问是否Cypher MATCH查询会起作用,但我想确保您没有假设SDN可能将您的存储库查询转换为后台查询(即findAll())。我完全不确定,但是可能SDN会将weightedValueRepo.findAll()之类的内容转换为MATCH (n:Value:WeightedValue) return n;。在Cypher中,这将返回节点及其所有属性。但是,请记住,如果您在Java中使用了List<Value> values = valueRepo.findAll(),则要牢记Value对象可能没有与WeightedValue对象相同的Java/class属性。
因此,在Cypher中通过匹配/查询Value标签,可以让您访问整个节点(包括仅在WeightedValue对象中定义的属性),而通过SDN查找/匹配可能不行,因为OGM必须将节点的属性映射到类(而该超类通常没有与其子类相同的属性)。
对于第二部分,我认为单个关系只有一个类型,而且不像标签那样工作,其中实体可以具有多个标签。但是,您可以在相同的节点之间创建多个不同类型的关系。我不确定一个@RelationshipEntity是否扩展另一个,如果SDN会创建两个rel或不会。也许您可以尝试并让我知道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接