【发布时间】:2017-03-14 16:07:54
【问题描述】:
我有以下要求:
- 给定一个源节点
- 查找一定范围内的所有节点(例如 4 跳)
- 并且目标节点有一个特殊的标签“x”
- 限制路径中节点的标签类型到目的地
- 只返回最短的路径长度(例如,如果我找到一个有 2 个跃点的节点,也不要找到有 3 或 4 个跃点的节点)
- 返回显示目标节点和之间路径所需的所有节点
我设法创建了一个查询,但性能不是很好。我认为这是因为带有标签“x”的节点数量过多
MATCH path = allShortestPaths((source)-[*..4]-(destination))
WHERE source.objectID IN ['001614914']
AND source:Y
AND destination:X
AND ALL(x IN nodes(path)[1..] WHERE any(l in labels(x) WHERE l in ['A', 'B', 'C']))
WITH path
LIMIT 1000
WITH COLLECT(path) AS paths, MIN(length(path)) AS minLength
WITH FILTER(p IN paths WHERE length(p)= minLength) AS pathList
LIMIT 25
UNWIND pathList as path
WITH [n in nodes(path)] as nodes
return nodes
如果我将查询更改为使用非最短路径函数,这在源没有很多传出路径时效果很好
MATCH path = ((source)-[*..4]-(destination))
WHERE source.objectID IN ['001614914']
AND source:Y
AND destination:X
AND ALL(x IN nodes(path)[1..] WHERE any(l in labels(x) WHERE l in ['A', 'B', 'C']))
WITH path
LIMIT 1000
WITH COLLECT(path) AS paths, MIN(length(path)) AS minLength
WITH FILTER(p IN paths WHERE length(p)= minLength) AS pathList
LIMIT 25
UNWIND pathList as path
WITH [n in nodes(path)] as nodes
return nodes
但是如果我有一个有很多子节点的源节点,这也有不好的表现......
目前我正在考虑是否从简单搜索所有目的地开始,并在每个找到的目的地上调用 shortestPath,这可能会更好,但我不太确定。
例如
MATCH (source)-[*..4]-(destination)
WHERE source.objectID IN ['001614914']
AND source:Y
AND destination:X
WITH destination
LIMIT 100
call apoc (shortest path ...)
...
或者有更好的方法吗?
【问题讨论】:
标签: performance neo4j cypher