【问题标题】:Combining two clauses in Neo4j makes query terribly slow在 Neo4j 中结合两个子句使查询非常慢
【发布时间】:2017-05-12 21:06:17
【问题描述】:

我是 Neo4j 的新手,可能在做一些愚蠢的事情,请帮忙。

我有 1800 万个节点,每个节点都有 2 个 string 属性(oid 和 name)。查询中未使用名称。

节点与一个 double 属性 (val) 有关系。

当我通过过滤 val 值搜索最短路径时,我会以毫秒为单位获得结果。

MATCH path=shortestPath( (p:ids{oid:'1027700070518'})-[*0..200]-(t:ids{oid:'1027739134950'})) WHERE ALL (x IN RELATIONSHIPS(path) WHERE x.val > 50.0) return length(path) as len, path

当我通过过滤 oid 值搜索最短路径时,我也会以毫秒为单位获得结果。

MATCH path=shortestPath( (p:ids{oid:'1027700070518'})-[*0..200]-(t:ids{oid:'1027739134950'})) WHERE NONE(n IN nodes(path) WHERE (n.oid = '1' or n.oid = '2' or n.oid = '3' or n.oid = '4' or n.oid='5' or n.oid = '6' )  ) return length(path) as len, path

但是将它们组合到一个查询中会使其永远运行。

MATCH path=shortestPath( (p:ids{oid:'1027700070518'})-[*0..200]-(t:ids{oid:'1027739134950'})) WHERE ( NONE(n IN nodes(path) WHERE (n.oid = '1' or n.oid = '2' or n.oid = '3' or n.oid = '4' or n.oid='5' or n.oid = '6' )) and (ALL (x IN RELATIONSHIPS(path) WHERE x.val > 50.0))) return length(path) as len, path

我是不是做错了什么?

解释对我没有帮助,我做了一个截图。 PROFILE 也永远运行。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    “问题”是最短路径(()-[*0..200]-())。将一个案例添加到您的图表中,其中有效路径存在于 3 个跃点中,并且它应该运行得相当快......但是您将最坏的可接受情况设置为任何边缘上的 200 个跃点。因此假设每个节点(平均而言)只有 3 条边,并且最短路径不会在一条边上回溯,对于所有 200 个节点,它必须检查 2 跳。假设您的数据足够大以至于所有这些跃点都未被访问,即必须检查 2^200 条路径以验证不存在路径(或 ^)。如您所见,在最坏的情况下,它的增长速度非常快。您可以通过减少允许的边缘(通过强制方向/类型)或限制跳数(如果您知道不应该有超过 42 个有效路径,请继续并将上限设置得尽可能低)来限制这一点。

    简而言之,当不容易找到解决方案时,必须检查所有可能性)(当不存在有效路径时,继续尝试您的“好”查询之一)

    【讨论】:

    • 你错了。 Neo4j 给我留下深刻印象的是最短路径/所有最短路径的速度。我已经对总共 18m 的 10k 个随机对象进行了测试,并且没有一个请求比 50-100ms 慢。它经常是 30 甚至 52 跳。没有路径的答案也很快。
    • 顺便说一下,我已经为我的问题发明了两种解决方法。首先是标记这些节点的关系(编号 1-6),这样我就可以使用一个过滤器。另一种方法是反之亦然 - 为不同范围的关系创建单独的集合,然后只使用第二个过滤器。第一种方式几乎不丑。 :) 但是,当然,如果有人能提出正确的方法 - 我很乐意接受你的帮助(明天开始赏金)
    • @OlegGritsak (1) Cypher 是一种描述性语言。仅仅因为 2 个查询在语义上相同,并不意味着 Cypher 会以相同的方式处理它们。 (2) 找到最短路径不是找到所有路径并向下过滤,而是找到一条路径并排除所有其他路径。如果 shortestpath 可以快速找到有效路径,或者排除任何存在,性能会很好。我要说的是,在最坏的情况下,性能有可能是灾难性的。 (neo4j.com/docs/developer-manual/current/cypher/execution-plans/…)
    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多