我有两种不同类型的节点(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
)。剩下的两个API
s 被orders
(list:/cards/{cardsId}
和/addresses/{addressesId}
.front-end
也访问了工作负载API
所包含的三个orders
(/orders/...
)也有可能两个
WORKLOAD
s 之间可能有一条ACCESSES_WORKLOAD
边,但它们之间没有任何API
共同的节点。除了边缘之外,A
WORKLOAD
可能还有一个额外的边缘/关系调用CAUSES_ATTACK
到。它在图像中用绿色表示。这可能并不总是存在。在所附图像中,工作负载对 API 具有此优势,但与其他任何s 无关。API
ACCESSES_API
front-end
/catalogue/sock
API
现在我想获取所有工作负载对的列表以及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-end
orders
collect(ID(a))
API
CONTAINS_API
w2 WORKLOAD
API
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}
有人可以帮助修复密码查询吗?我在redisgraph
via中这样做cypher
。我不能使用仅 Neo4j 的查询选项/实用程序/帮助程序。谢谢。