【问题标题】:Is a DFS Cypher Query possible?是否可以进行 DFS 密码查询?
【发布时间】:2014-02-03 23:12:20
【问题描述】:

我的数据库包含大约 30 万个节点和 35 万个关系。

我目前的查询是: start n=node(3) match p=(n)-[r:move*1..2]->(m) where all(r2 in relationships(p) where r2.GameID = STR(id(n))) return m;

这个查询中涉及的节点都是同一种类型的,它们在游戏中是不同的位置。每个关系都包含一个属性“GameID”,如果您想通过路径传递图形,则该属性用于识别正确的关系。因此,如果您开始在一个节点处遍历图形并遵循具有正确 GameID 的关系,则不会有另一条从第一个节点开始的具有适合 GameID 关系的路径。 有些节点有数百个进出关系,有些节点只有几个。

问题是,我不知道如何告诉 Cypher 如何做到这一点。上面的查询适用于 1 或 2 的深度,但它应该看起来像 [r:move*] 以返回整个路径,大约 20-200 跳。 但是如果我提高值,查询将不会完成。我认为 Cypher 在与起始节点相关的每个路径深度处查看每个传出关系,但正如我已经解释过的,只有一条正确的路径。所以它应该做某种 DFS 搜索而不是 BFS 搜索。有办法吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我会考虑为 GameID 属性配置关系索引。见http://docs.neo4j.org/chunked/milestone/auto-indexing.html#auto-indexing-config

    完成此操作后,您可以尝试如下查询(我尚未对此进行测试):

    START n=node(3), r=relationship:rels(GameID = 3)
    MATCH (n)-[r*1..]->(m)
    RETURN m;
    

    这样的查询会将 MATCH 原因考虑的关系限制为仅具有您关心的 GameID 的关系。由于索引,获取初始关系集合会很快。

    顺便说一句:由于 neo4j 重复使用其内部生成的 ID(用于已删除的节点),将这些 ID 存储为 GameID 将使您的数据不可靠(除非您从不删除任何此类节点)。您可能希望生成和使用您自己的唯一 ID,并将它们存储在您的节点中并将它们用于您的 GameID;而且,如果你这样做了,那么你还应该为你自己的 ID 创建一个唯一性约束——作为一个很好的副作用,这将自动为你的 ID 创建一个索引。

    【讨论】:

    • 似乎是个好建议。但由于我不使用 Java API,我无法通过它设置关系索引。看起来 Cypher 无法做到这一点。我会试试这个:docs.neo4j.org/chunked/snapshot/…
    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 2010-09-08
    • 2016-03-25
    • 2015-01-25
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多