密码聚合两种不同节点类型之间的公共节点类型

cypher aggregating common node type between two distinct node types

现在我想获取所有工作负载对的列表以及它们之间 API 节点的 ID(如果有的话)。我尝试的密码查询是:

MATCH (w1)
MATCH (w1)-[awe:ACCESSES_WORKLOAD]->(w2 {deleted_time: -1})
OPTIONAL MATCH (w2)-[:CONTAINS_API]->(a:API)
OPTIONAL MATCH (w1)-[:ACCESSES_API]->(a)
OPTIONAL MATCH (w1)-[cae:CAUSES_ATTACK]->(a)
WHERE ID(w1) IN %s
RETURN DISTINCT awe, w1, w2, collect(ID(a)), collect(distinct cae.name)

我期望的输出是 table,如下所示:

w1             | w2          | API IDs List           | Attack Name
======================================================================
front-end-node | user-node   | [6 elements in a list] | null
orders-node    | user-node   | [2 elements in a list] | null
front-end-node | orders-node | [3 elements in a list] | null
front-end-node | some-node   | [1 element in a list]  | attack-name

但我得到的是:

w1             | w2          | API IDs List           | Attack Name
======================================================================
front-end-node | user-node   | [8 elements in a list] | null
orders-node    | user-node   | [8 elements in a list] | null
front-end-node | orders-node | [3 elements in a list] | null
front-end-node | some-node   | [1 element in a list]  | attack-name

在前两行中,对于 user 节点,我得到了 user 工作负载包含的所有 API 的列表,而不仅仅是 [=15] =]s 由 front-endorders 访问。 collect(ID(a)) 将所有 API 节点与查询中的 w2 WORKLOAD CONTAINS_API edge/relationship 聚合,而不是 APIACCESSES_APIw1 workload.

为了简洁起见,如果我将我的期望映射到 JSON,我需要的输出将是这样的:

{
  sourceWorkloadID: <ID(front-end)>
  targetWorkloadID: <ID(user)>
  apis: [ ID(/cards), ID(/register), ID(/addresses), ID(/customers/...)]  // len here is six
  attack: null
},
{
  sourceWorkloadID: <ID(orders)>
  targetWorkloadID: <ID(user)>
  apis: [ ID(/cards/{cardsId), ID(/addresses/{addressesId})] // len here is two
  attack: null
}, {3rd row}, {4th row}

有人可以帮助修复密码查询吗?我正在通过 cypherredisgraph 中执行此操作。我不能使用仅限 neo4j 的查询 options/utils/helpers。谢谢

执行此操作的方法是将边匹配到与 API 匹配相同的行中:

MATCH (w1)
MATCH (w1)-[awe:ACCESSES_WORKLOAD]->(w2 {deleted_time: -1})
OPTIONAL MATCH (w2)-[:CONTAINS_API]->(a:API)<-[:ACCESSES_API]-(w1)
OPTIONAL MATCH (w1)-[cae:CAUSES_ATTACK]->(a)
WHERE ID(w1) IN %s
RETURN DISTINCT awe, w1, w2, collect(ID(a)), collect(distinct cae.name)