我有两种不同类型的节点(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_API
与 w1 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。谢谢。
1条答案
按热度按时间nzkunb0c1#
方法是将边缘匹配到与api匹配相同的行中: