我将首先解释当前的域模型。在北美,汽车制造商共生产约3500种不同的装饰(如2016福特F150 XLT驾驶室长箱,或2016款奥迪A3 4dr AWD quattro轿车)
我创建了一个Neo4j图表,其中每年的每个修剪都是一个Node(带有标签:Vehicle
)。我还创建了第二组Feature类型的节点(所有节点都标记为:Feature
)。功能节点还有第二个标签,用于描述功能的类型(如:MDL
,:DIV
,:TRIM
,:DRIVE
等),并且功能具有值属性。所以,对于上面列出的F150
VehicleId | FeatureType | FeatureValue
----------|-------------|-------------
"380333" | "BOX" | "regular"
"380333" | "DIV" | "Ford"
"380333" | "TYPE" | "Truck
"380333" | "MDL" | "F-150"
"380333" | "CYLINDERS" | "V-8"
"380333" | "TRIM" | "XL"
etc...
一切都很好。现在,我们有一个名为FVD(灵活车辆描述的简称)的第二个概念,它是一种简单的查询语法,描述了一组使用特征的车辆。例如,以下FVD(+ COUNTRY = US + YR = 2016 + DIV = Mazda + TYPE = Sport Utility)表示所有美国2016 Mazda Sport Utilities。我已将FVD节点添加到数据库(标签为:FVD
),并且与上述相同的功能节点具有INCLUDES关系。
最后,我的问题是,鉴于我在某个:Vehicle
节点开始,我如何找到:FVD
个:Feature
个节点的所有:INCLUDES
个{通过{{ 1}} relationship)是:Vehicle节点指向的所有节点。注意::Vehicle
节点可以指向比:FVD
节点更多的功能。
如果您在考虑,为什么不在:FVD
和:Vehicle
之间建立直接关系。原因是因为:FVD
代表一个集合,所以来自集合的车辆全年都是动态的,这就是我保持这个抽象层的原因。
对于冗长的帖子感到抱歉,只是想解释一下情况。我开始玩" Collect",但我达到了我有2个收藏的地步,我需要知道一个收藏是否完全在另一个收藏中。
答案 0 :(得分:1)
尝试使用all
列表谓词。 all
列表谓词将测试谓词是否适用于列表的所有元素。
我认为这适用于您的示例:
MATCH (v:Vehicle{styleId:"380333"})--(vehFeature:Feature)
WITH collect(vehFeature) as vehFeatures
MATCH (fvd:FVD)-[:INCLUDES]->(fvdFeature:Feature)
WITH fvd, vehFeatures, collect(fvdFeature) as fvdFeatures
WHERE all(vf IN vehFeatures WHERE vf IN fvdFeatures)
RETURN fvd