2017-02-13 344 views
0

所以我已经加载了一个数据集到Neo4j与10 MM节点的东西。我正在寻求解决从两个节点开始的问题,寻找排除关系类型子集的最短路径。这里是一个查询尝试的例子:neo4j优化最短路径大量节点

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个这样的路径。所以我想知道是否1)任何人都看到了这样做的明显更有效的方法,并且 2)如果我想从满足最后一个子句的那些中选择最短路径,那么将如何修改查询?非常感谢您的帮助。

回答

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属性不为空?

+0

感谢威廉 - 仍然很呆滞我害怕,但您的查询是有道理的。 –

+0

你有':PT(src)'上的索引吗? –