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

Ale*_*ros 2 neo4j cypher

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

  • 范围查询.带来距特定节点3个跳距离内的所有节点(及其距离)
  • 在特定节点和一组节点之间提供最短路径(BFS)距离(因为图形是无向的和未加权的).
  • 带来特定节点和所有其他图节点之间的最短路径(BFS)距离.

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

Fro*_*its 7

是的,密码可以做所有这些事情.

范围查询看起来像这样:

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

这为您提供了与MyNode具有给定关系类型的1到20跳之间的所有"b"节点.匹配的路径是一个变量,可以应用各种密码函数.因此,对于每条路径,您可以询问它有多长,中间有什么,等等.该暗号的Refcard显示适用于道路,以便为您可以与他们做什么的感觉功能.

可以在此处找到最短路径搜索,并使用密码中的shortestPathallShortestPaths函数.

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

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

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