首页 > 解决方案 > 密码聚合两个不同节点类型之间的公共节点类型

问题描述

图表视图

现在我想获取所有工作负载对的列表以及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)

我期待的输出如下表:

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节点,我得到了工作负载API包含的所有 s的列表,user而不仅仅是由andAPI访问的 s 。聚合与查询中的 有边/关系的所有节点,而不是仅与s 的 s 。front-endorderscollect(ID(a))APICONTAINS_APIw2 WORKLOADAPIACCESSES_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}

有人可以帮助修复密码查询吗?我在redisgraphvia中这样做cypher。我不能使用仅 Neo4j 的查询选项/实用程序/帮助程序。谢谢。

标签: neo4jrediscyphergraph-databasesredisgraph

解决方案


这样做的方法是将边缘匹配到与 API MATCH 相同的行中:

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)

推荐阅读