检查两个节点是否在恒定时间内具有关系

时间:2015-12-16 20:12:07

标签: neo4j

目前我在节点上有一个标签为“d:ReferenceEntity”的唯一索引。此查询运行大约需要11秒,返回7行。授予T1有大约400,000个关系。

我不确定为什么这会花费太长时间,因为我们可以将所有连接节点的Map构建到T1,从而提供恒定的时间。

我是否缺少Neo4j可以提供的其他索引功能?此外,我的整个数据集都在内存中,所以它不应该有任何转到磁盘。

match(n:ReferenceEntity {entityId : "T1" })-[r:HAS_REL]-(d:ReferenceEntity) WHERE d.entityId in ["T2", "T3", "T4"] return n


:schema
 Indexes
  ON :ReferenceEntity(entityId) ONLINE (for uniqueness constraint) 

 Constraints
  ON (referenceentity:ReferenceEntity) ASSERT referenceentity.entityId IS UNIQUE

解释计划:

Explain Plan

1 个答案:

答案 0 :(得分:2)

  1. 您曾使用EXPLAIN代替PROFILE来获取该查询计划,因此会显示误导性的估计行数。如果您使用过PROFILE,则Expand(All)操作实际上会有大约400,000行,因为该操作实际上会迭代每个关系。这就是您的查询需要很长时间的原因。

  2. 您可以尝试此查询,告知Cypher使用d上的索引以及n。 (在我的机器上,我必须使用USING INDEX子句两次才能获得所需的结果。)使用PROFILE调整Cypher代码肯定是值得的。

    MATCH (n:ReferenceEntity { entityId : "T1" })
    USING INDEX n:ReferenceEntity(entityId)
    MATCH n-[r:HAS_REL]-(d:ReferenceEntity)
    USING INDEX d:ReferenceEntity(entityId)
    WHERE d.entityId IN ["T2", "T3", "T4"]
    RETURN n, d;
    

    以下是个人资料计划(在我的数据库中,我有两个满足WHERE测试的关系):

  3. Profile Plan