我有以下图表,它是查询的结果,如下所示:
MATCH p=(parent:FEATURE)-[*]->(gap:GAP)
WHERE parent.name = "Update Profile" AND ANY(substring IN ["CSRF", "manipulate"]
WHERE gap.name CONTAINS substring)
RETURN p,
apoc.coll.removeAll(
[node IN NODES(p) | [fp = (node:RULE)<-[:REQUIRE]-(f:FACT) | fp ]],
[[]]) AS factPaths
我想要做的是删除节点GENERIC_FEAT、规则、攻击类别和攻击向量。我想连接功能 -> 威胁 -> GAP <- FACT。 是否可以在查询返回图形时像这样连接图形?我想修改我的查询以返回具有以下模式的图表功能 - >威胁 - >差距<- FACT而不是图片中显示的长图表。
这是一个查询,它会删除您不想看到的关系和节点,并将它们替换为剩下的节点之间的虚拟关系:
MATCH (fe:Feature)-->+(t:Threat)-->+(g:GAP)
MATCH (g)<--+(fa:FACT)
WITH collect(DISTINCT [fe, t]) + collect(DISTINCT [t, g]) AS hases,
collect(DISTINCT [fa, g]) AS requireses
WITH
COLLECT {
WITH hases
UNWIND hases AS pair
RETURN [
pair[0],
apoc.create.vRelationship(pair[0], 'HAS', {}, pair[1]),
pair[1]
] AS tuple
} +
COLLECT {
WITH requireses
UNWIND requireses AS pair
RETURN [
pair[0],
apoc.create.vRelationship(pair[0], 'REQUIRES', {}, pair[1]),
pair[1]
] AS tuple
} AS tuples
UNWIND tuples AS tuple
RETURN tuple[0], tuple[1], tuple[2]
根据上面的数据,浏览器中的结果大致如下:
有两个 MATCH 子句,因为
GAP <-- FACT
路径需要重新遍历部分 Threat --> GAP
路径,并且 Cypher 要求关系在从 MATCH
发出的结果中是唯一的。
collect()
+ DISTINCT
可以删除节点之间创建的所有重复关系,因为存在多个路径重新遍历相同的子路径。