密码聚合两种不同节点类型之间的公共节点类型
cypher aggregating common node type between two distinct node types
我有两种不同类型的节点(redisgraph 中的 LABELS)。图中的蓝色圆圈称为WORKLOAD
。黄色的叫做API
.
两个工作负载之间,有一个relationship/edgeACCESSES_WORKLOAD
(由最轻的blue/cyan边表示)。在附图中,front-end
工作负载访问 user
和 order
工作负载。 order
工作负载访问 user
工作负载。
在API
节点和WORKLOAD
节点之间存在两种类型的relationships/edges。一个称为 CONTAINS_API
(图像中的深蓝色 link),另一个称为 ACCESSES_API
(图像中的紫色 link)。例如,在附图中,user
工作负载包含八个 API
,其中六个被 front-end
消耗(列表:包括 3 /customers/...
、/addresses
、/register
、/cards
)。剩余的两个 API
被 orders
消耗(列表:/cards/{cardsId}
和 /addresses/{addressesId}
。
front-end
也访问了orders
工作负载中包含的三个API
(/orders/...
)
也有可能两个 WORKLOAD
之间可能有一条 ACCESSES_WORKLOAD
边,但没有任何 API
作为它们之间共同的节点。
除了 ACCESSES_API
边之外,WORKLOAD
可能还有一个额外的 edge/relationship 称为 CAUSES_ATTACK
到 API
。它在图像中用绿色表示。这可能并不总是存在。在所附的图像中,front-end
工作负载与 /catalogue/sock
API 相比具有优势,但与其他任何 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)
我期望的输出是 table,如下所示:
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
工作负载包含的所有 API
的列表,而不仅仅是 [=15] =]s 由 front-end
和 orders
访问。 collect(ID(a))
将所有 API
节点与查询中的 w2 WORKLOAD
CONTAINS_API
edge/relationship 聚合,而不是 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}
有人可以帮助修复密码查询吗?我正在通过 cypher
在 redisgraph
中执行此操作。我不能使用仅限 neo4j 的查询 options/utils/helpers。谢谢
执行此操作的方法是将边匹配到与 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)
我有两种不同类型的节点(redisgraph 中的 LABELS)。图中的蓝色圆圈称为
WORKLOAD
。黄色的叫做API
.两个工作负载之间,有一个relationship/edge
ACCESSES_WORKLOAD
(由最轻的blue/cyan边表示)。在附图中,front-end
工作负载访问user
和order
工作负载。order
工作负载访问user
工作负载。在
API
节点和WORKLOAD
节点之间存在两种类型的relationships/edges。一个称为CONTAINS_API
(图像中的深蓝色 link),另一个称为ACCESSES_API
(图像中的紫色 link)。例如,在附图中,user
工作负载包含八个API
,其中六个被front-end
消耗(列表:包括3 /customers/...
、/addresses
、/register
、/cards
)。剩余的两个API
被orders
消耗(列表:/cards/{cardsId}
和/addresses/{addressesId}
。front-end
也访问了orders
工作负载中包含的三个API
(/orders/...
)也有可能两个
WORKLOAD
之间可能有一条ACCESSES_WORKLOAD
边,但没有任何API
作为它们之间共同的节点。除了
ACCESSES_API
边之外,WORKLOAD
可能还有一个额外的 edge/relationship 称为CAUSES_ATTACK
到API
。它在图像中用绿色表示。这可能并不总是存在。在所附的图像中,front-end
工作负载与/catalogue/sock
API 相比具有优势,但与其他任何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)
我期望的输出是 table,如下所示:
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
工作负载包含的所有 API
的列表,而不仅仅是 [=15] =]s 由 front-end
和 orders
访问。 collect(ID(a))
将所有 API
节点与查询中的 w2 WORKLOAD
CONTAINS_API
edge/relationship 聚合,而不是 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}
有人可以帮助修复密码查询吗?我正在通过 cypher
在 redisgraph
中执行此操作。我不能使用仅限 neo4j 的查询 options/utils/helpers。谢谢
执行此操作的方法是将边匹配到与 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)