目前我在节点上有一个标签为“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
解释计划:
答案 0 :(得分:2)
您曾使用EXPLAIN
代替PROFILE
来获取该查询计划,因此会显示误导性的估计行数。如果您使用过PROFILE
,则Expand(All)
操作实际上会有大约400,000行,因为该操作实际上会迭代每个关系。这就是您的查询需要很长时间的原因。
您可以尝试此查询,告知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
测试的关系):