Graph 子图上的Neo4J路径查询

Graph 子图上的Neo4J路径查询,graph,neo4j,cypher,Graph,Neo4j,Cypher,我正在试图得到一个图中两个节点之间的最短路径。该图相当大,大约有100万个节点(将来还会增长)。由于路径查找的复杂性随着路径的长度而爆炸,我希望所有可能的路径都保持较小。因此,我只想在原始图的子图上运行路径查询。这将使图形大小减少约1/3。有3种不同的节点标签:TypeA、TypeB、TypeC。 我认为运行一个匹配,然后运行一个WITH,只会将匹配的数据传递给后续的匹配。然而,当我跑步时: MATCH (n) WHERE n:TypeA OR n:TypeB WITH n MATCH p =

我正在试图得到一个图中两个节点之间的最短路径。该图相当大,大约有100万个节点(将来还会增长)。由于路径查找的复杂性随着路径的长度而爆炸,我希望所有可能的路径都保持较小。因此,我只想在原始图的子图上运行路径查询。这将使图形大小减少约1/3。有3种不同的节点标签:TypeA、TypeB、TypeC。 我认为运行一个匹配,然后运行一个WITH,只会将匹配的数据传递给后续的匹配。然而,当我跑步时:

MATCH (n) WHERE n:TypeA OR n:TypeB WITH n 
MATCH p = shortestPath((n:TypeA {hash: "<some-hash>"})-[r*]-(e:TypeA {hash: "<some-other-hash>"})) 
RETURN p
匹配(n),其中n:TypeA或n:TypeB与n
匹配p=shortestPath((n:TypeA{hash:'})-[r*]-(e:TypeA{hash:'}))
返回p
路径的节点只能是TypeA或TypeB。但是,我看到找到的路径也可以遍历TypeC节点(它们包含在结果中)

我想到的另一个查询是下面的查询,但是它的性能似乎要差得多,因为它甚至没有完成

MATCH p = shortestPath((n:TypeA {hash: "<some-hash>"})-[r*]-(e:TypeA {hash: "<some-other-hash>"})) 
WHERE ALL ( x IN nodes(p) WHERE x:TypeA OR x:TypeB ) 
RETURN path
MATCH p=shortestPath((n:TypeA{hash:'})-[r*]-(e:TypeA{hash:'}))
其中所有(x在节点(p)中,其中x:TypeA或x:TypeB)
返回路径
关于对子图执行查询,MATCH-with缺少什么? 是否有另一种方法可以在两个节点之间找到只遍历特定标签的路径

我已经找到了第二个问题的解决方案,但是所有这些都包括遍历整个图,然后检查路径是否满足标签约束。对于我正在处理的图形,我需要更高性能的东西

提前谢谢你帮了我的忙

编辑: 数据库模式澄清。可以连接的标签受到高度限制

  • TypeA可以连接到:TypeA,TypeB
  • TypeB可以连接到:TypeA,TypeC
  • 类型C可以连接到:类型B
(:A)--(:A)--(:B)--(:C)

其中,每个:A都有一个类型为:A的前置机和一个后继机。 一:A可以连接多个:B 一:B最多有一:A连接 一个:B可以连接多个:C 一:C最多连接一:B


这种结构意味着您还可以将图形分为3层。我想“切断”一层(of:A)以减少子图。有没有办法只对图形的子集运行后续(路径)查询?据我所知,这就是我们合作的目的。我想我理解不正确。

第一次查询的行为是正确的,因为您是按类型限制开始和结束节点,但对开始和结束节点之间的节点没有限制。此外,您是否尝试过为哈希属性编制索引?如果您可以使用APOC,则有一个过程可以执行。此外,如果你不局限于使用基于Cyfor的API,你可能会考虑使用.@ GabsSZARYNAS来扩展路径过程:有没有办法得到最短路径呢?也就是说:获取限制开始节点和结束节点之间的节点标签的最短路径…没错,在这种情况下APOC的当前扩展将不起作用。