DFS Cypher查询是否可行?

时间:2014-02-03 23:12:20

标签: neo4j cypher

我的数据库包含大约300k个节点和350k个关系。

我目前的查询是: 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搜索。有办法吗?

1 个答案:

答案 0 :(得分:2)

我会考虑为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创建一个索引。