【问题标题】:Finding Specific Path in Neo4j Quickly在 Neo4j 中快速查找特定路径
【发布时间】:2016-07-04 11:31:27
【问题描述】:

我有 recently asked about how to find all paths between two types os nodes in a way where all the edges in the path had the same attribute(就像同一个 ID)。这将是这样的:

MATCH (a {type: 'cin1'})-[rels:Next*1.. {value: 1}]->(b {type: 'cancer'}) 
RETURN (a), (b)

在哪里有 value: 1 我会有 value: same for all edges.

我找到了一种通过使用类似这样的方法来解决这个问题的方法(正如我在另一个问题中所回答的那样):

MATCH (a:Label {type: 'cin1'})
MATCH (b:Label {type: 'cancer'})
MATCH shortestPath((a)-[rels:Next*1..20]->(b))
WHERE ALL(r in tail(rels) WHERE (head(rels)).value = r.value)
RETURN (a), (b)

我遇到的问题是,这种方法首先创建所有可能的不同路径,然后过滤它们,在我的情况下,这会创建成倍增长的路径。比如下面这张图

:

给出的方法将首先匹配所有路径:

id:1 -> id:1 -> id:1 
id:1 -> id:2 -> id:1 
id:1 -> id:1 -> id:2 
id:1 -> id:2 -> id:2 
id:1 -> id:2 -> id:3 
...

然后才过滤这些选项以返回 1->1->12->2->23->3-> 3 以此类推。因此,事实证明这种方法非常无效,我想知道是否有更简单的方法。

【问题讨论】:

  • 有什么方法可以优化你的人际关系?现在我的假设是他们都使用具有不同属性的相同标签。你能把它们改成标签,还是不可行?
  • 不可行 :/ 基本上你有太多了
  • 我害怕那个。虽然我了解您的性能问题,但我想知道您是否已在示例数据集上运行此程序以确认性能确实是一个问题。我猜你有一个庞大的数据集和相当庞大的连接网络?
  • 是的!几十万个节点!虽然它可以在较小的数据集上完美运行
  • 我想知道那个 WHERE ALL 子句......是在最短路径执行中使用的(如果是这样,是不是对整个路径中的每个关系都执行检查)评估),还是仅在详尽搜索结束时执行以进行过滤?另外,您能否提供有关根节点(cin1 类型)的任何信息?那里有多少?他们平均有多少感兴趣的关系?在它们之间迭代查询是否比像现在这样使用一个超级查询更有意义?

标签: neo4j cypher graph-databases


【解决方案1】:

就优化而言,我首先会研究如何优化开始和结束节点上的快速匹配,因为这应该会显着减少扫描的节点。

我的预感是您可能没有在 :Label.type 上建立索引,如果这是您匹配节点的主要方式,那么这可能是需要考虑和测试的事情。

查看是否可以在开始或结束节点上添加标签也可能有效。至少看起来:癌症可能会被有效应用,但如果这是一个更通用的医疗应用程序,这种查询需要对许多疾病有效,所以我不确定这是否可行你。

在这种情况下,我认为您最好的选择是优化 shortestPath(),并 PROFILE 您的查询,以确保在计算 shortestPath 期间使用 WHERE ALL 子句,而不是作为详尽搜索后的过滤器(请参阅@ 987654321@ 和 Shortest Path Planning)。如果分析表明它被用作过滤器而不是在构建最短路径时,您会想看看是否可以选择更有效的谓词最短路径对于不匹配的模式将很快失败。

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多