Spring 数据 Neo4j 4 和动态产品属性
Spring Data Neo4j 4 and dynamic product properties
在我的 Neo4j/SDN 项目中,我必须执行以下任务 - 我有一个必须定义一组产品特性的父节点(假设 ParentNode
),例如:
weight: Double
size: Integer
license: String
active: Boolean
此外,可以在应用程序运行期间添加新产品特征(具有任何新名称和类型)。
ParentNode
可以有一组子节点(比方说 ProductNode
),每个节点都可以为 ParentNode
定义的某个特征提供自己的值。
基于这些特征名称和值,我需要能够过滤 ProductNode
个节点。
以前这个结构是由我通过 SDN3 DynamicProperties 实现的,但是 AFAIK - DynamicProperties 支持已从 SDN 4 中删除。
所以我的问题是 - 如何基于 SDN 4 实现以下结构?
已更新
此外,将每个 ParentNode
特征定义为单独的节点(假设 CharacteristicNode
)的想法如何
例如
CharacteristicNode.name = weight
CharacteristicNode.type = Double
CharacteristicNode.name = license
CharacteristicNode.type = String
...
并且每个ProductNode
可以提供一个与ProductNode
和CharacteristicNode
关联的值节点(CharacteristicValueNode
)。
这里的主要问题是如何支持 CharacteristicValueNode
的不同类型以及如何根据不同的特征及其值过滤 ProductNode
节点?
在 SDN 4 中,您可以将这些属性建模为(属性 名称、值)的 Map 并编写 custom converter。这会将地图转换为节点上的字符串 属性(可能是 json 样式),然后从图形返回到您的地图。
这样做的缺点是,为这些动态属性编写自定义查询并不容易,因为它们并没有真正作为独立属性存储在图表中——相反,您的转换器会将它们压缩成一个。
更新
如果您要将每个 Characteristic
类型定义为一个节点(在您的示例中,您将有 4 个节点 - 一个代表重量、大小、活动、许可证中的每一个),那么您不需要一个中间 CharacteristicValueNode
来关联 ProductNode
和 CharacteristicNode
。相反,您可以根据 ProductNode
和 CharacteristicNode
之间的关系为特征的产品价值建模。
例如,如果 ProductNode
只有重量和尺寸,那么您将有两个关系 - 一个从 ProductNode
到重量 CharacteristicNode
以及关系上的重量值,另一个来自ProductNode 的大小 CharacteristicNode
与该关系上的大小值。
在 SDN 4 中,这些将被建模为关系实体。例如,
@RelationshipEntity(type="CHARACTERISTIC")
public class ProductCharacteristic {
Long id;
@StartNode ProductNode product;
@EndNode CharacteristicNode characteristic;
int value;
...
}
ProductNode 将包含这些关系实体的集合
Set<ProductCharacteristic> characteristics;
然后您可以查询与某个名称的特征相关的产品。或者使用 findByCharacteristicName
查询 ProductCharacteristic
我还没有真正尝试过这种方法,但值得考虑的是,这会迫使您的底层图形模型发生变化以支持动态属性。
在我的 Neo4j/SDN 项目中,我必须执行以下任务 - 我有一个必须定义一组产品特性的父节点(假设 ParentNode
),例如:
weight: Double
size: Integer
license: String
active: Boolean
此外,可以在应用程序运行期间添加新产品特征(具有任何新名称和类型)。
ParentNode
可以有一组子节点(比方说 ProductNode
),每个节点都可以为 ParentNode
定义的某个特征提供自己的值。
基于这些特征名称和值,我需要能够过滤 ProductNode
个节点。
以前这个结构是由我通过 SDN3 DynamicProperties 实现的,但是 AFAIK - DynamicProperties 支持已从 SDN 4 中删除。
所以我的问题是 - 如何基于 SDN 4 实现以下结构?
已更新
此外,将每个 ParentNode
特征定义为单独的节点(假设 CharacteristicNode
)的想法如何
例如
CharacteristicNode.name = weight
CharacteristicNode.type = Double
CharacteristicNode.name = license
CharacteristicNode.type = String
...
并且每个ProductNode
可以提供一个与ProductNode
和CharacteristicNode
关联的值节点(CharacteristicValueNode
)。
这里的主要问题是如何支持 CharacteristicValueNode
的不同类型以及如何根据不同的特征及其值过滤 ProductNode
节点?
在 SDN 4 中,您可以将这些属性建模为(属性 名称、值)的 Map 并编写 custom converter。这会将地图转换为节点上的字符串 属性(可能是 json 样式),然后从图形返回到您的地图。
这样做的缺点是,为这些动态属性编写自定义查询并不容易,因为它们并没有真正作为独立属性存储在图表中——相反,您的转换器会将它们压缩成一个。
更新
如果您要将每个 Characteristic
类型定义为一个节点(在您的示例中,您将有 4 个节点 - 一个代表重量、大小、活动、许可证中的每一个),那么您不需要一个中间 CharacteristicValueNode
来关联 ProductNode
和 CharacteristicNode
。相反,您可以根据 ProductNode
和 CharacteristicNode
之间的关系为特征的产品价值建模。
例如,如果 ProductNode
只有重量和尺寸,那么您将有两个关系 - 一个从 ProductNode
到重量 CharacteristicNode
以及关系上的重量值,另一个来自ProductNode 的大小 CharacteristicNode
与该关系上的大小值。
在 SDN 4 中,这些将被建模为关系实体。例如,
@RelationshipEntity(type="CHARACTERISTIC")
public class ProductCharacteristic {
Long id;
@StartNode ProductNode product;
@EndNode CharacteristicNode characteristic;
int value;
...
}
ProductNode 将包含这些关系实体的集合
Set<ProductCharacteristic> characteristics;
然后您可以查询与某个名称的特征相关的产品。或者使用 findByCharacteristicName
ProductCharacteristic
我还没有真正尝试过这种方法,但值得考虑的是,这会迫使您的底层图形模型发生变化以支持动态属性。