【问题标题】:Neo4j: Finding simple path between two nodes takes a lot of timeNeo4j:寻找两个节点之间的简单路径需要很多时间
【发布时间】:2014-04-24 10:42:07
【问题描述】:

Neo4j:即使在使用上限 (*1..4) 之后,在两个节点之间寻找简单路径也需要很长时间。我不想使用 allShortestPath 或 shortestPath,因为它不会返回所有路径。

Match p=((n {Name:"Node1"}) -[*1..4]-> (m {Name:"Node2"})) return p;

有什么建议可以让它更快吗?

【问题讨论】:

  • 您需要所有路径还是只需要一个?如果是后者,返回时使用LIMIT 1即可。
  • 不,我需要所有可能的路径,否则我可以使用 shortestPath

标签: neo4j cypher


【解决方案1】:

如果您有很多节点,请尝试创建一个索引,这样 neo4j 数据库引擎就不必搜索每个节点来找到具有正确 Name 属性值的节点。

我假设,在您的示例中,nm 节点实际上是相同的节点“类型”。如果这是真的,那么:

  1. 为每个节点(与nm 的类型相同)添加一个标签(我称之为“X”)。您可以使用以下命令将“X”标签添加到由变量 n 表示的节点。您需要在其前面加上适当的 MATCH 子句:

    SET n:X

  2. 在带有X 标签的节点的Name 属性上创建索引,如下所示:

    在 :X(Name) 上创建索引;

  3. 将您的查询修改为:

    匹配 p=((n:X {Name:"Node1"}) -[*1..4]-> (m:X {Name:"Node2"})) 返回 p;

如果您执行上述操作,那么您的查询应该会更快。

【讨论】:

  • Node1 和 Node2 不是同一类型,但我会通过在节点上创建标签和索引来尝试您的建议。
  • 是的,这让它变得非常快。谢谢cybersam。
  • 当然不客气。如果您认为它解决了您的问题,请考虑接受我的回答。
  • 兄弟你太棒了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
相关资源
最近更新 更多