[英]Performance in Neo4j
我有一個2.217.731節點和3.127.475關系的數據庫,其中節點是不同的設備,它們之間的關系就像“CONNECTED_TO”,“IS_INSIDE”等。
我試圖遍歷圖表以查找特定節點。 在Cypher看起來像
MATCH (n:Equipment)<-[IS_INSIDE*]-()<-[CONNECTED_TO*]-(m:Cable) where n.name = "name" RETURN m
使用Java Core API,我知道這應該是查詢Neo4j並花費幾秒鍾的最快方法,但它運行了幾十分鍾。
我正在使用neo4j-2.0.0和java版本“1.7.0_45”,最大Java堆大小7演出
Neo4j屬性:
Map<String, String> config = new HashMap<>();
config.put( "neostore.nodestore.db.mapped_memory", "1800M" );
config.put( "neostore.relationshipstore.db.mapped_memory", "3G" );
config.put( "neostore.propertystore.db.mapped_memory", "100M" );
config.put( "neostore.propertystore.db.strings.mapped_memory", "150M" );
config.put( "neostore.propertystore.db.arrays.mapped_memory", "10M" );
inserter = BatchInserters.inserter("target/graphDb", config);
我是Neo4j的新手,不知道如何調整它以獲得更好的性能。
如果你必須遍歷整個圖表,那么這將是緩慢的。 如果這是一個常見的查詢,請考慮在Equiptment.name上創建索引,這在neo4j 2.0.0里程碑中是可能的。 然后它將只查找索引中的匹配名稱(基本上是哈希表),然后檢查匹配節點周圍的模式 - 這將非常快。 見http://blog.neo4j.org/2013/12/neo4j-20-ga-graphs-for-everyone.html
請在設備節點的屬性上為名稱創建索引。
CREATE INDEX ON :Equipment(name)
然后請嘗試以下優化查詢。
MATCH (n:Equipment { name: "name" }),
(n)<-[IS_INSIDE*]-(x),
(x)<-[CONNECTED_TO*]-(m:Cable)
RETURN m
請注意,這與您指定的等效匹配,但它會將其組合成三元組,這會導致Neo4j上的查詢執行計划首先匹配屬性名稱上的n:Equipment節點,而不是執行圖形全局匹配操作。 從減少的n:Equipment
節點集中,以下匹配語句將更加IS_INSIDE
掃描IS_INSIDE
和CONNECTED_TO
的可變長度模式。
首先要意識到在GraphDB中,性能主要取決於您構建的模型類型和各種節點的基數(在您的情況下為設備和電纜)。 通常使用PROFILE和EXPLAIN查詢將獲得有關查詢性能的信息性見解,包括數據庫命中數和所需的時間。 基於較低數量的DB命中選擇查詢是有利的。
有了它,讓我們先看看你正在使用的查詢:
MATCH (n:Equipment)<-[IS_INSIDE*]-()<-[CONNECTED_TO*]-(m:Cable)
where n.name = "name"
RETURN m
關於這一點的幾點指示是:
1)當您嘗試查找特定設備節點內的設備節點時,您不提及節點標簽。 嘗試使用:
MATCH (n:Equipment)<-[IS_INSIDE*]-(:Equipment)
代替
MATCH (n:Equipment)<-[IS_INSIDE*]-()
因為在您的情況下,您在設備和電纜節點中搜索名稱為“名稱”的設備。 使用我提到的替代方案,它將僅限於Cable節點。 假設設備不能在電纜內部。
2)與其他人一樣,在設備和電纜節點之上提到建築物指數將會有所幫助。 在Equipment.name屬性上構建索引。 您可以在所有Cable屬性上構建索引,這可以進一步提高性能。
您還可以分享有多少個設備節點以及有多少個有線節點。 此外,我假設您已經確保設備節點和電纜節點是不同的。 擁有更多關系是可以的,但我們的模型通常可以從更少的節點中獲益。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.