我有两种不同类型的节点(redisgraph 中的标签)。图中的蓝色圆圈称为
WORKLOAD。黄色的被称为API。在两个工作负载之间,存在关系/边缘
ACCESSES_WORKLOAD(由最浅的蓝色/青色边缘表示)。在附加的图像中,front-end工作负载访问user和order工作负载。order工作负载访问user工作负载。在
API节点和WORKLOAD节点之间存在两种类型的关系/边。一个称为CONTAINS_API(图像中的深蓝色链接),另一个称为ACCESSES_API(图像中的紫色链接)。例如,在附图中,user工作负载包含 8 个API,其中 6 个被消耗front-end(列表:包括3 /customers/...、/addresses、/register、/cards)。剩下的两个APIs 被orders(list:/cards/{cardsId}和/addresses/{addressesId}.front-end也访问了工作负载API所包含的三个orders(/orders/...)也有可能两个
WORKLOADs 之间可能有一条ACCESSES_WORKLOAD边,但它们之间没有任何API共同的节点。除了边缘之外,A
WORKLOAD可能还有一个额外的边缘/关系调用CAUSES_ATTACK到。它在图像中用绿色表示。这可能并不总是存在。在所附图像中,工作负载对 API 具有此优势,但与其他任何s 无关。APIACCESSES_APIfront-end/catalogue/sockAPI
现在我想获取所有工作负载对的列表以及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 的查询选项/实用程序/帮助程序。谢谢。
