gpt4 book ai didi

java - 如何在给定起始节点类型和允许的关系类型的情况下使用 cypher 或 TraversalDescription API 获取所有连接的子图

转载 作者:行者123 更新时间:2023-11-30 06:35:05 30 4
gpt4 key购买 nike

我想获取图表中通过 2 个关系 Rel1 和 Rel2 之一连接的所有连接子图。我有一个起始节点类型(不是确切的节点)。

目前,我有以下基本查询,它为我提供了从 n1 到 n2 的 2 到 10 跳的所有路径。

CYPHER 2.3 MATCH p = (n1:H)-[r:Rel1|Rel2*2..10]-(n2:H) 将节点(p)作为结果返回结果

但是我需要连接这些路径的连接子图。任何建议或起点都会有帮助。

我尝试的其他事情是 TraversalDescription java API 进行深度优先搜索,但它不采用起始节点类型,而是采用特定的起始节点?

附上我的图表的示例以及我期望从查询中得到哪些子图。 enter image description here

最佳答案

[已更新]

expanding subgraphs 有多个 APOC 程序.

apoc.path.subgraphNodes 似乎与您的用例最直接相关。有其使用示例here .

这是一个稍微简化的示例,它还使用 apoc.periodic.commit (重复执行 Cypher 查询,直到返回 0 或 NULL)和 apoc .coll.subtract(从一个集合中减去另一个集合)。在这个例子中,创建了一个Temp节点来保存临时数据,并在最后删除它。返回的结果应该是对象的集合。每个对象都有一个 subgraph_ids 集合,其中包含属于同一子图的节点的 native ID。

MATCH (n:H)-[:Rel1|Rel2]-(:X)-[:Rel1|Rel2]-(:H)
WITH COLLECT(DISTINCT ID(n)) AS ids
CREATE (x:Temp {ids: ids, result: []})
WITH x
CALL apoc.periodic.commit(
"MATCH (x:Temp) " +
"CALL apoc.path.subgraphNodes(x.ids[0], {relationshipFilter:'Rel1|Rel2', labelFilter:'H|X', filterStartNode:false, limit:-1}) YIELD node " +
"WITH x, COLLECT(ID(node)) AS subgraph_ids " +
"SET x.ids = apoc.coll.subtract(x.ids, subgraph_ids) " +
"SET x.result = x.result + {subgraph_ids: subgraph_ids} " +
"RETURN SIZE(x.ids);"
,
NULL) YIELD updates
WITH x, x.result AS result
DELETE x
RETURN result;

顶部的 MATCH 子句查找属于至少具有 2 个 Rel1 和/或 Rel2< 的子图的 H 节点 关系。这些节点的 native ID 用于初始化 Temp 节点的 ids 集合。

apoc.periodic.commit执行的Cypher代码将重复:

  • ids 中获取第一个 ID
  • 获取子图中包含具有该 ID 的节点的节点(具有 Rel|Rel2 类型和 X|H 标签)
  • ids 中减去子图节点的 ID
  • 将包含子图节点 ID 集合的对象添加到 Temp 节点的 result 集合
  • 返回ids集合的当前大小(如果为0,则apoc.periodic.commit将完​​成执行)。

您可以修改此查询以返回实际节点、过滤具有特定标签的节点等等。

关于java - 如何在给定起始节点类型和允许的关系类型的情况下使用 cypher 或 TraversalDescription API 获取所有连接的子图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45335786/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com