子图

时间:2017-10-19 07:19:12

标签: graph neo4j cypher

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

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

路径的节点应该只是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-WITH缺少什么? 是否有另一种方法可以在仅遍历某些标签的两个节点之间找到路径?

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

提前感谢您帮助我。

编辑: 数据库架构澄清。可以连接的标签受到严格限制。

  • TypeA可以连接到:TypeA,TypeB
  • TypeB可以连接到:TypeA,TypeC
  • TypeC可以连接到:TypeB

(:A) - (:A) - (:B) - (:C)

每个:A有一个前任和一个类型的继承者:A。 一:A可以有很多:B连接 一:B最多只有一个:连接 一:B可以有很多:C连接 一:C最多只有一个:B连接

这种结构意味着你也可以想到3层的图形。我想&#34; cut&#34;关闭一层(of:A)以减少子图。有没有办法只在图的子集上运行后续(路径)查询?据我所知,这是WITH的目的。我想我的理解不正确。

0 个答案:

没有答案