cypher在两个不同的节点类型之间聚合公共节点类型

mtb9vblg  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(476)


我有两种不同类型的节点(redisgraph中的标签)。图中的蓝色圆圈称为 WORKLOAD . 黄色的叫做 API .
在两个工作负载之间,存在一种关系/优势 ACCESSES_WORKLOAD (由最浅的蓝色/青色边表示)。在附图中, front-end 工作负载访问 user 以及 order 工作量。这个 order 工作负载访问 user 工作量。
介于 API 节点和a WORKLOAD 节点存在两种类型的关系/边。一个叫做 CONTAINS_API (图中的深蓝色链接)另一个称为 ACCESSES_API (图片中的紫色链接)。例如,在附加的图像中 user 工作量包含8个 API s、 其中六个被 front-end (列表:包括 3 /customers/... , /addresses , /register , /cards ). 剩下的两个 API s被 orders (列表: /cards/{cardsId} 以及 /addresses/{addressesId} .
这个 front-end 同时访问三个 API 包含在 orders 工作量也很大( /orders/... )
也有可能是两个 WORKLOAD s可能有一个 ACCESSES_WORKLOAD 他们之间的边缘,但没有任何 API 它们之间的共同点。
WORKLOAD 可能有一个额外的优势/关系叫做 CAUSES_ATTACK 到一个 API 除了 ACCESSES_API 边缘。在图像中用绿色表示。这可能并不总是存在。在所附的图像中 front-end 工作负载有这个优势 /catalogue/sock api,但不与任何其他 API s。
现在我想得到所有工作负载对的列表和 API 它们之间的节点(如果有的话)。我尝试的cypher查询是:

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 它包含在 user 工作量,而不仅仅是 API 通过 front-end 以及 orders . 这个 collect(ID(a)) 正在聚合所有 API 具有 CONTAINS_API 边缘/与 w2 WORKLOAD 在查询中而不是 API 只有 ACCESSES_APIw1 workload .
如果为了简洁起见,我将期望Map到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}

有人能帮忙解决密码查询吗?我在做这个 redisgraph 通过 cypher . 我不能只使用neo4j查询选项/utils/helpers。谢谢。

nzkunb0c

nzkunb0c1#

方法是将边缘匹配到与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)

相关问题