neo4j优化shortestpath大量节点

时间:2017-02-13 20:19:15

标签: neo4j cypher

因此我已经将数据集加载到Neo4j,其中包含10 MM节点。我正在寻找解决从两个节点开始的问题,寻找排除关系类型子集的最短路径。以下是查询尝试的示例:

match (p1:PT)-[*]-(p2:PT{src:"8"}),
p=shortestPath((p1)-[*..20]-(p2)) 
with p where p1.src is not null 
and NONE (n in nodes(p) where labels(n) in [["X"],["Y"],["FX","RX"],["RX","FX"]]) 
return p limit 5000

查询需要永远(有效)。据我了解,查询将采用所有对p1,p2,它们之间存在某种关系,确定每对之间的最短路径,删除最后一个句子失败的最短路径,如果它们存在则返回最多5000个这样的路径。 / p>

所以我想知道1)任何人都会看到一种明显更有效的方法 2)如果我想从满足最后一个子句的那条中选择最短路径,那么如何修改查询?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

尝试:

MATCH (p2:PT {src:"8"})
MATCH p=shortestPath((p1:PT)-[*..20]-(p2)) 
WHERE p1.src IS NOT NULL
AND none(n in nodes(p) where labels(n) in [["X"],["Y"],["FX","RX"],["RX","FX"]]) 
RETURN p LIMIT 5000;

这应该会好一些。 (p1:PT)-[*]-(p2:PT {src: "8"})将匹配连接到p2所有路径,任意长度。此外,删除WITH语句将允许将谓词置于shortestPath条件中。

是否还有一些其他标准可以更精确地指定p1,除了它有标签PT且它的src属性不为空?