[英]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.