我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)
而不是值:1 我会有值:所有边都相同。
我找到了一种方法来解决这个问题,使用类似的东西(在我的另一个问题中回答):
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-> 1 , 2-> 2-> 2 , 3- > 3-> 3 等等。因此,事实证明这种方法非常无效,我想知道是否有更简单的方法。
答案 0 :(得分:0)
就优化而言,我首先考虑优化开始和结束节点上的快速匹配的方法,因为这应该会显着减少扫描的节点。
我的预感是你可能没有索引:Label.type,如果那是你与节点匹配的主要方法,这可能是需要考虑和测试的东西。
查看是否可以在开始或结束节点上添加标签也可能很有效。至少看起来像:癌症可能会被有效地应用,但如果这是一个更通用的医疗应用程序,这种查询需要对许多疾病有效,所以我不确定这是否可行你。
在这种情况下,我认为最好的办法是优化shortestPath()和PROFILE你的查询,以确保在计算shortestPath时使用WHERE ALL子句,而不是在穷举搜索后使用过滤器(参见{ {3}}和Shortest Path)。如果分析显示它被用作过滤器而不是构建最短路径,那么您将需要查看是否可以选择更有效的谓词最短路径,对于非匹配模式将快速失败。