【问题标题】:cypher aggregating common node type between two distinct node types密码聚合两个不同节点类型之间的公共节点类型
【发布时间】:2020-11-28 06:51:09
【问题描述】:

  • 我有两种不同类型的节点(redisgraph 中的标签)。图中的蓝色圆圈称为WORKLOAD。黄色的称为API

  • 在两个工作负载之间,有一个关系/边缘ACCESSES_WORKLOAD(由最浅的蓝色/青色边缘表示)。在附图中,front-end 工作负载访问 userorder 工作负载。 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/sock API 相比具有这一优势,但与其他任何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-endorderscollect(ID(a)) 正在聚合所有 API 节点,其中 CONTAINS_API 边缘/关系与查询中的 w2 WORKLOAD 而不是 APIs 仅具有 ACCESSES_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}

有人可以帮助修复密码查询吗?我通过cypherredisgraph 中执行此操作。我不能使用仅 Neo4j 的查询选项/实用程序/帮助程序。谢谢。

【问题讨论】:

    标签: neo4j redis cypher graph-databases redisgraph


    【解决方案1】:

    这样做的方法是将边缘匹配到与 API MATCH 相同的行中:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多