【问题标题】:Neo4j - Performance: Find Nodes with a certain label with a relation to the source nodeNeo4j - 性能:查找具有特定标签且与源节点有关系的节点
【发布时间】: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


    【解决方案1】:

    您可能想尝试使用“NODE_GLOBAL”唯一性的 APOC 路径扩展器,它通常比可变长度匹配执行得更好。它还具有在遍历期间将节点列入白名单的方法,但这也适用于起始节点,因此我们必须将 :Y 包含在白名单中。

    看看这是否适合你:

    MATCH path = (source:Y)
    WHERE source.objectID IN ['001614914']
    CALL apoc.path.expandConfig(source, {labelFilter:'+A|B|C|Y', maxLevel:4, uniqueness:'NODE_GLOBAL'}) YIELD path
    WITH path, last(nodes(path)) as destination
    WHERE destination:X AND NONE(node in TAIL(nodes(path)) WHERE node:Y)
    // all the rest is the same as your old query
    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
    RETURN NODES(path) as nodes
    

    【讨论】:

    • 我试图让我的老板相信这个限制^^
    • 在 APOC 上进行了一些更改,这将使这种解决方案更容易,例如是否将标签过滤器应用于起始节点的选项(因此您不会需要在标签过滤器中指定'Y'),以及同时使用多个过滤器操作的能力(因此您可以指定路径的端节点标签以及白名单)。限价操作也在进行中。不确定何时会发布新版本,但可能会在接下来的两周左右。
    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多