Spring Data Neo4j 4和动态产品属性

时间:2016-07-28 14:20:46

标签: neo4j spring-data-neo4j spring-data-neo4j-4

在我的Neo4j / SDN项目中,我必须实现以下任务 - 我有一个父节点(比如说ParentNode),它必须定义一组产品特性,例如:

weight: Double
size: Integer
license: String
active: Boolean

此外,可以在应用程序运行时添加新产品特性(使用任何新名称和类型)。

ParentNode可以有一组子节点(比方说ProductNode),这些节点中的每一个都可以为ParentNode定义的特定特征提供自己的值。

根据这些特征名称和值,我需要有可能过滤ProductNode个节点。

此前,我已通过SDN3 DynamicProperties实现了此结构,但已从SDN 4中删除了AFAIK - DynamicProperties支持。

所以我的问题是 - 如何基于SDN 4实现以下结构?

已更新

此外,如何将每个ParentNode特征定义为一个单独的节点(让我们说CharacteristicNode

例如

CharacteristicNode.name = weight
CharacteristicNode.type = Double

CharacteristicNode.name = license
CharacteristicNode.type = String

...

并且每个ProductNode都可以提供与CharacteristicValueNodeProductNode相关联的值节点(CharacteristicNode)。

这里的主要问题是如何支持CharacteristicValueNode的不同类型以及如何根据不同的特征及其值来过滤ProductNode个节点?

1 个答案:

答案 0 :(得分:3)

在SDN 4中,您可以将这些属性建模为(属性名称,值)的Map并编写custom converter。这会将Map转换为节点上的String属性(可能是json样式),然后从图形转换回Map。

这样做的缺点是为这些动态属性编写自定义查询并不容易,因为它们并没有真正作为独立属性存储在图形中 - 相反,您的转换器会将它们压缩为单个属性。

<强>更新

如果您要将每个Characteristic类型定义为节点(在您的示例中,您将有4个节点 - 一个代表重量,大小,活动,许可证),那么您不需要中间CharacteristicValueNodeProductNodeCharacteristicNode相关联。相反,您可以为ProductNodeCharacteristicNode之间的关系建立特征产品的值。 例如,如果ProductNode只有重量和大小,那么您将有两个关系 - 一个从ProductNode到权重CharacteristicNode,其中权重值为关系,另一个来自ProductNode为大小CharacteristicNode,其大小值为该关系。

在SDN 4中,这些将被建模为RelationshipEntities。例如,

@RelationshipEntity(type="CHARACTERISTIC")
public class ProductCharacteristic {

Long id;
@StartNode ProductNode product;
@EndNode CharacteristicNode characteristic;
int value;
...

}

ProductNode将包含这些关系实体的集合

Set<ProductCharacteristic> characteristics;

然后,您可以查询与特定名称相关的特征产品。或使用ProductCharacteristic

查询findByCharacteristicName

我还没有真正尝试过这种方法,但值得考虑一下这种变化会在您的基础图模型中强制支持动态属性。