2014-10-02 186 views
2

我不知道Neo4j如此,请耐心等待。我有一个大的(1M节点)无向图,未加权的图。假设我神奇地将这个图导入Neo4j。 Neo4j查询引擎(cypher)可以支持以下类型的查询吗?Neo4j最短路径(BFS)距离查询变体

  • 范围查询。使距离特定节点3跳距内的所有节点(以及它们的距离)
  • 在特定节点和一组特定节点之间引入最短路径(BFS)距离(因为该图无向加权 )节点。
  • 带来特定节点和所有其他图形节点之间的最短路径(BFS)距离。

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

回答

6

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

范围查询是这个样子:

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

这就给了你所有的“B”的节点是1个20之间跳从与给定的关系类型MYNODE。匹配的路径是一个变量,可以应用各种密码功能。因此,对于每条路径,您可以问它是多久,中间是什么,等等。 cypher refcard显示适用于路径的函数,以了解您可以对它们执行的操作。

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

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

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

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

谢谢你的回答。已经upvoted。但是a)范围查询实际上包括哪个节点处于该范围内的最小距离的信息。如:a)节点c = 2hops,节点b = 3hops。关于最短路径。我知道Neo4j给出了2个节点之间的最短路径。但是当我想计算节点和所有其他图形节点之间的距离时,这是否意味着我必须执行总共1M个查询? – Alexandros 2014-10-02 14:32:52

+0

更新回答解决您的其他问题。一探究竟。 – FrobberOfBits 2014-10-02 14:38:17

+0

非常好。非常感谢你。这就是我需要知道的 – Alexandros 2014-10-02 14:39:45