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



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

  • 范围查询。将以下所有节点(及其距离)距离特定节点3跳以内
  • 使最短路径(BFS)距离(因为图是无向的并且未加权)
  • 将特定节点与所有其他图节点之间的最短路径(BFS)距离相加

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

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

范围查询看起来像这样:

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

这为您提供了从具有给定关系类型的MyNode跳1到20的所有"b"节点。匹配的路径是一个变量,它可以应用各种密码函数。因此,对于每个路径,你可以询问它有多长,中间有什么,等等。密码refcard显示应用于路径的函数,以了解你可以对它们做些什么。

最短路径搜索可以在这里找到,并使用密码中的shortestPathallShortestPaths函数。

如果你想得到从某个东西到图中其他所有东西的最短路径,你可以在一个查询中做到这一点;最短路径将从匹配"头"节点和"尾"节点开始。在寻找从一件事到其他一切的最短路径的情况下,头节点匹配将是您感兴趣的节点,尾节点匹配将为"图中的任何节点"。例如MATCH (a:MyNodeOfInterest), (b), p=shortestPath((a)-[*]->(b))。因此,您可以在一个查询中做到这一点,,如果您试图在一个一百万节点的图中找到从一个事物到其他事物的最短路径,无论您使用什么图数据库,这都需要一些时间。

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

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

最新更新