Spring 数据 Neo4j 5 node/relationship 标签和继承
Spring Data Neo4j 5 node/relationship labels and inheritance
我有以下 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
节点,例如 weight
和 size
.
我不想改变现有的 Value
class 而是想引入一个新的 - 继承的,例如:
@NodeEntity
public class WeightedValue extends Value{
private Long weight;
private Long size;
}
我有一个问题,下面的查询 MATCH(n:Value) RETURN n
return 也会是 WeightedValue
的实例吗?
是否可以通过以下查询搜索 WeightedValue
个节点(按 Value
标签)?
MATCH(n:Value) WHERE n.size > 1000 RETURN n
上述方法是否适用于 @RelationshipEntity
和继承?那么是否可以对 @RelationshipEntity
使用继承以及如何为基础和继承的 class 保持相同的标签(例如 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;
}
对于你问题的第一部分,由 WeightedValue extends Value
class 创建的节点将同时具有 Value
和 WeightedValue
标签(你可以这样做,所以它不会' 如果你愿意,可以使用超级class)。所以,只要所有WeightedValue
个节点都是Value
个节点,那么你就可以在Value
个节点上MATCH
。
此外,在您的问题中,您询问 Cypher MATCH
查询是否有效,但我想确保您没有假设 SDN 可能将您的存储库查询转换为 behind-the-scenes 查询(即 findAll())。我完全不确定,但 SDN 可能会将诸如 weightedValueRepo.findAll()
之类的内容转换为: MATCH (n:Value:WeightedValue) return n;
在 Cypher 中,此 returns 节点及其所有属性。但是,如果在 Java 中您使用了 List<Value> values = valueRepo.findAll()
请记住,值对象可能不具有与 WeightedValue
对象完全相同的 Java/class 属性。
因此,在 Cypher matching/querying 上的 Value 标签可以让您访问整个节点(包括仅在 WeightedValue 对象中定义的属性,finding/matching 通过 SDN 可能不会,因为 OGM 必须映射class 节点的属性(超级 class 通常不具有与其子 class 相同的属性)。
对于第二部分,我认为单个 Relationship
只有一种类型,不像标签那样工作,其中一个实体可以有多个。不过,您可以在相同节点之间创建多个不同类型的关系。我不确定一个 @RelationshipEntity
是否会扩展另一个 SDN 是否会创建两个 rel。也许你可以试试,然后告诉我。 :slightly_smiling_face:
我有以下 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
节点,例如 weight
和 size
.
我不想改变现有的 Value
class 而是想引入一个新的 - 继承的,例如:
@NodeEntity
public class WeightedValue extends Value{
private Long weight;
private Long size;
}
我有一个问题,下面的查询 MATCH(n:Value) RETURN n
return 也会是 WeightedValue
的实例吗?
是否可以通过以下查询搜索 WeightedValue
个节点(按 Value
标签)?
MATCH(n:Value) WHERE n.size > 1000 RETURN n
上述方法是否适用于 @RelationshipEntity
和继承?那么是否可以对 @RelationshipEntity
使用继承以及如何为基础和继承的 class 保持相同的标签(例如 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;
}
对于你问题的第一部分,由 WeightedValue extends Value
class 创建的节点将同时具有 Value
和 WeightedValue
标签(你可以这样做,所以它不会' 如果你愿意,可以使用超级class)。所以,只要所有WeightedValue
个节点都是Value
个节点,那么你就可以在Value
个节点上MATCH
。
此外,在您的问题中,您询问 Cypher MATCH
查询是否有效,但我想确保您没有假设 SDN 可能将您的存储库查询转换为 behind-the-scenes 查询(即 findAll())。我完全不确定,但 SDN 可能会将诸如 weightedValueRepo.findAll()
之类的内容转换为: MATCH (n:Value:WeightedValue) return n;
在 Cypher 中,此 returns 节点及其所有属性。但是,如果在 Java 中您使用了 List<Value> values = valueRepo.findAll()
请记住,值对象可能不具有与 WeightedValue
对象完全相同的 Java/class 属性。
因此,在 Cypher matching/querying 上的 Value 标签可以让您访问整个节点(包括仅在 WeightedValue 对象中定义的属性,finding/matching 通过 SDN 可能不会,因为 OGM 必须映射class 节点的属性(超级 class 通常不具有与其子 class 相同的属性)。
对于第二部分,我认为单个 Relationship
只有一种类型,不像标签那样工作,其中一个实体可以有多个。不过,您可以在相同节点之间创建多个不同类型的关系。我不确定一个 @RelationshipEntity
是否会扩展另一个 SDN 是否会创建两个 rel。也许你可以试试,然后告诉我。 :slightly_smiling_face: