Neo4j最短路径(BFS)距离查询变体

时间:2014-10-02 14:11:30

标签: neo4j cypher

我不知道Neo4j所以,请耐心等待。我有一个大的(1M节点)无向,未加权的图形。假设我神奇地将此图导入Neo4j。 Neo4j查询引擎(cypher)能否支持以下类型的查询?

  • 范围查询。带来我所有的节点(和它们的距离) 距离特定节点3英里的距离
  • 带有最短路径(BFS)距离(因为图形是无向的) 特定节点和一组节点之间的未加权。
  • 使特定节点与所有其他图节点之间的最短路径(BFS)距离。

如果这些类型的查询实际上是可行的,没有递归类型实现,而是直接来自Cypher,我应该期望什么类型的性能(几秒,几秒或几分钟)?

1 个答案:

答案 0 :(得分:7)

是的,cypher可以做所有这些事情。

范围查询看起来像这样:

MATCH path=(a:MyNode { name: "Foo"})-[:myRelationshipType*1..20]->(b));

它为您提供了具有给定关系类型的MyNode的1到20跳之间的所有“b”节点。匹配的路径是一个变量,可以应用各种密码函数。因此,对于每条路径,您可以询问它有多长,中间有什么,等等。 cypher refcard显示适用于路径的函数,以了解您可以使用它们执行的操作。

最短路径搜索can be found here并使用密码中的shortestPathallShortestPaths函数。

如果你想从图中获得基本上所有其他内容的最短路径,你可以在一个查询中做到这一点;最短路径将从匹配“head”节点和“tail”节点开始。在找到从一件事物到其他事物的最短路径的情况下,头部节点匹配将是您感兴趣的节点,并且尾部节点匹配将是“图中的任何节点”。例如。 MATCH (a:MyNodeOfInterest), (b), p=shortestPath((a)-[*]->(b))。所以你可以在一个查询中做到这一点,但是,如果你试图在一百万个节点图中找到从一件事到其他一切的最短路径,那就是花一些时间,无论你使用什么图形数据库。

在表现方面,没有人能够真正准确地回答这个问题。这将取决于许多不同的因素,如:

  1. 总数据量
  2. 索引策略
  3. 您对节点标签和关系类型的使用/滥用
  4. 总路径长度
  5. JVM /内存/缓存配置。