在我的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
都可以提供与CharacteristicValueNode
和ProductNode
相关联的值节点(CharacteristicNode
)。
这里的主要问题是如何支持CharacteristicValueNode
的不同类型以及如何根据不同的特征及其值来过滤ProductNode
个节点?
答案 0 :(得分:3)
在SDN 4中,您可以将这些属性建模为(属性名称,值)的Map并编写custom converter。这会将Map转换为节点上的String属性(可能是json样式),然后从图形转换回Map。
这样做的缺点是为这些动态属性编写自定义查询并不容易,因为它们并没有真正作为独立属性存储在图形中 - 相反,您的转换器会将它们压缩为单个属性。
<强>更新强>
如果您要将每个Characteristic
类型定义为节点(在您的示例中,您将有4个节点 - 一个代表重量,大小,活动,许可证),那么您不需要中间CharacteristicValueNode
与ProductNode
和CharacteristicNode
相关联。相反,您可以为ProductNode
和CharacteristicNode
之间的关系建立特征产品的值。
例如,如果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
我还没有真正尝试过这种方法,但值得考虑一下这种变化会在您的基础图模型中强制支持动态属性。