1。创建图表:
第一个语句创建节点,第二个语句创建它们之间的关系。
CREATE
(Yellow1:Yellow {name: 'Yellow 1'}),
(Yellow2:Yellow {name: 'Yellow 2'}),
(Yellow3:Yellow {name: 'Yellow 3'}),
(Yellow4:Yellow {name: 'Yellow 4'}),
(Yellow5:Yellow {name: 'Yellow 5'}),
(Yellow6:Yellow {name: 'Yellow 6'}),
(Green1:Green {name: 'Green 1'}),
(Green2:Green {name: 'Green 2'}),
(Green3:Green {name: 'Green 3'}),
(Green4:Green {name: 'Green 4'}),
(Green5:Green {name: 'Green 5'}),
(Green6:Green {name: 'Green 6'}),
(Green7:Green {name: 'Green 7'}),
(Green8:Green {name: 'Green 8'}),
(Green9:Green {name: 'Green 9'}),
(Green10:Green {name: 'Green 10'}),
(Green11:Green {name: 'Green 11'}),
(Green12:Green {name: 'Green 12'}),
(Green13:Green {name: 'Green 13'})
CREATE
// upper graph
(Green1)-[:IS_PART_OF]->(Yellow1),
(Green2)-[:IS_PART_OF]->(Yellow1),
(Green3)-[:IS_PART_OF]->(Yellow1),
(Green4)-[:IS_PART_OF]->(Yellow1),
(Green3)-[:IS_PART_OF]->(Yellow2),
(Green4)-[:IS_PART_OF]->(Yellow2),
// lower graph
(Green5)-[:IS_PART_OF]->(Yellow3),
(Green6)-[:IS_PART_OF]->(Yellow3),
(Green5)-[:IS_PART_OF]->(Yellow4),
(Green6)-[:IS_PART_OF]->(Yellow4),
(Green7)-[:IS_PART_OF]->(Yellow4),
(Green8)-[:IS_PART_OF]->(Yellow4),
(Green7)-[:IS_PART_OF]->(Yellow5),
(Green8)-[:IS_PART_OF]->(Yellow5),
(Green9)-[:IS_PART_OF]->(Yellow5),
(Green10)-[:IS_PART_OF]->(Yellow5),
(Green11)-[:IS_PART_OF]->(Yellow5),
(Green12)-[:IS_PART_OF]->(Yellow5),
(Green8)-[:IS_PART_OF]->(Yellow6),
(Green13)-[:IS_PART_OF]->(Yellow6);
2。建议的解决方案:
2.1 基本思路:
对于黄色节点“this”,将与另一个黄色节点“that”的关系数量与节点“this”的所有关系数量进行比较。如果数量相等,则节点“this”是“that”的子节点。
2.2 解释:
- 识别两个黄色节点之间的所有对
- 识别黄-黄对中的所有绿色节点
- 计算黄-黄对中绿色节点的数量
- 识别被检查的黄色节点的所有关系
- 统计正在检查的黄色节点的所有关系的数量
- 过滤那些黄-黄对,其中所有关系的数量等于对关系的数量
2.3 密码声明:
// |-------------------------------------- (1) ---------------------------------------|
MATCH yellowPairPath = (yellowA:Yellow)<-[pairRelation:IS_PART_OF]-(:Green)-[:IS_PART_OF]->(yellowB:Yellow)
WITH DISTINCT yellowA, yellowB, pairRelation
// |-------- (2) --------|
WITH yellowA, startNode(pairRelation) AS pairRelations, yellowB
// |------- (3) ------|
WITH yellowA, count(pairRelations) AS pairRelationAmount, yellowB
// |---------------------- (4) -----------------------|
MATCH (yellowA:Yellow)<-[allRelations:IS_PART_OF]-(:Green)
// |------ (5) ------|
WITH yellowA, pairRelationAmount, count(allRelations) AS allRelationsAmount, yellowB
// |---------------- (6) ----------------|
WHERE pairRelationAmount = allRelationsAmount
RETURN yellowA, yellowB;
3。结果:
根据您的要求,对于列出的节点,结果必须解释为“YellowA 是 YellowB 的子节点”。
╒═══════════════════╤═══════════════════╕
│"yellowA" │"yellowB" │
╞═══════════════════╪═══════════════════╡
│{"name":"Yellow 2"}│{"name":"Yellow 1"}│
├───────────────────┼───────────────────┤
│{"name":"Yellow 3"}│{"name":"Yellow 4"}│
└───────────────────┴───────────────────┘