【发布时间】:2020-11-28 06:51:09
【问题描述】:
-
我有两种不同类型的节点(redisgraph 中的标签)。图中的蓝色圆圈称为
WORKLOAD。黄色的称为API。 -
在两个工作负载之间,有一个关系/边缘
ACCESSES_WORKLOAD(由最浅的蓝色/青色边缘表示)。在附图中,front-end工作负载访问user和order工作负载。order工作负载访问user工作负载。 -
在
API节点和WORKLOAD节点之间存在两种类型的关系/边。一个称为CONTAINS_API(图像中的深蓝色链接),另一个称为ACCESSES_API(图像中的紫色链接)。例如,在附图中,user工作负载包含八个APIs,其中六个被front-end使用(列表:包括3 /customers/...、/addresses、/register、/cards)。剩下的两个APIs 被orders消耗(列表:/cards/{cardsId}和/addresses/{addressesId}。 -
front-end还访问三个API,它们也包含在orders工作负载中 (/orders/...) -
也有可能两个
WORKLOADs 之间可能有一个ACCESSES_WORKLOAD边,但没有任何API作为它们之间的公共节点。 -
除了
ACCESSES_API边之外,WORKLOAD可能与API有一个额外的边/关系,称为CAUSES_ATTACK。它在图像中用绿色表示。这可能并不总是存在。在所附图像中,front-end工作负载与/catalogue/sockAPI 相比具有这一优势,但与其他任何APIs 均无优势。
现在我想获取所有工作负载对的列表以及它们之间的 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 节点,我得到了user 工作负载包含的所有APIs 的列表,而不仅仅是APIs 访问的front-end 和orders。 collect(ID(a)) 正在聚合所有 API 节点,其中 CONTAINS_API 边缘/关系与查询中的 w2 WORKLOAD 而不是 APIs 仅具有 ACCESSES_API 和 w1 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}
有人可以帮助修复密码查询吗?我通过cypher 在redisgraph 中执行此操作。我不能使用仅 Neo4j 的查询选项/实用程序/帮助程序。谢谢。
【问题讨论】:
标签: neo4j redis cypher graph-databases redisgraph