使用Cypher,如何确定一个关系集合是否完全包含在另一个关系集合中

时间:2017-08-11 17:17:30

标签: neo4j cypher

我将首先解释当前的域模型。在北美,汽车制造商共生产约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个收藏的地步,我需要知道一个收藏是否完全在另一个收藏中。

1 个答案:

答案 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