Neo4j 检查两个节点在恒定时间内是否存在关系
目前,我在节点上有一个唯一的索引,标签为“d:ReferenceEntity”。运行此查询大约需要11秒,返回7行。T1拥有大约400000个关系 考虑到我们可以构建一个所有连接节点到T1的映射,从而提供恒定的时间,我不确定为什么这会花费太长的时间 我是否遗漏了Neo4j可以提供的其他索引功能?另外,我的整个数据集都在内存中,所以它不应该有任何与磁盘相关的内容Neo4j 检查两个节点在恒定时间内是否存在关系,neo4j,Neo4j,目前,我在节点上有一个唯一的索引,标签为“d:ReferenceEntity”。运行此查询大约需要11秒,返回7行。T1拥有大约400000个关系 考虑到我们可以构建一个所有连接节点到T1的映射,从而提供恒定的时间,我不确定为什么这会花费太长的时间 我是否遗漏了Neo4j可以提供的其他索引功能?另外,我的整个数据集都在内存中,所以它不应该有任何与磁盘相关的内容 match(n:ReferenceEntity {entityId : "T1" })-[r:HAS_REL]-(d:Reference
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
而不是PROFILE
来获取该查询计划,因此它显示了误导性的估计行数。如果您使用了PROFILE
,那么Expand(All)
操作实际上会有大约400000行,因为该操作实际上会遍历每个关系。这就是为什么您的查询需要这么长时间d
和n
上使用索引。(在我的机器上,我不得不两次使用usingindex
子句来获得所需的结果。)使用PROFILE
来调优密码显然是值得的
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
测试):谢谢你,这样做了,明确地告诉它要使用哪些索引,从11秒减少到78毫秒。很高兴为你提供帮助。请记住接受你问题的最佳答案。