[英]How should I check if two nodes have relationship with each other,in neo4j embedded database in java?
[英]Check if two nodes have a relationship in constant time
目前,我在带有标签“ d:ReferenceEntity”的节点上具有唯一索引。 该查询运行大约需要11秒钟,返回7行。 授予的T1有大约40万个关系。
考虑到我们可以建立所有连接到T1的节点的Map,因此我不知道为什么会花这么长时间,因此可以提供恒定的时间。
我是否缺少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
而不是PROFILE
来获取该查询计划,因此它显示了误导的估计行数。 如果使用过PROFILE
,那么Expand(All)
操作实际上将有大约40万行,因为该操作实际上将遍历每个关系。 这就是为什么您的查询需要这么长时间的原因。
您可以尝试执行此查询,该查询告诉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;
这是配置文件计划(在我的数据库中,我有2个满足WHERE
测试的关系):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.