2013-10-31 28 views
2

我正在建立一個用自然語言編寫的句法註釋句子的分貝。數據庫結構非常具體,所以我想知道是否可以使用neo4j來完成這個任務。數據庫由許多孤立的圖形(表示句子)組成,每個圖形都是一個節點鏈,類似於NODE1-[:NEXT]->NODE2-[:NEXT]->NODE3,每個節點都是一些帶有屬性的單詞。大部分對db的查詢都像START x=node:nodes(lemma="buy") MATCH x-[:NEXT]->y-[:NEXT]->z RETURN x,y,z,所以基本上只是提取ngrams。我使用基於詞語引擎的簡單索引。加速neo4j查詢與許多起始節點

db中有6500萬個節點,2.7億個屬性和1.1億個關係。

我正在使用neo4j 2.0.0 M-06。

問題是,neo4j需要太多時間來執行這樣的ngram查詢。例如,上面的查詢需要140+秒。它似乎取決於在索引中找到的起始節點的數量。如果數量很大(約50k),則查詢滯後。

我試着通過webadmin,cypher通過java和遍歷框架查詢cypher,它看起來像從索引檢索項目時有一些問題,就像它在我遍歷它們時收集項目。在cypher-java中,當我執行查詢時,它需要500ms,但是當我調用迭代器時,它需要上面提到的140+秒。

任何人都可以告訴我,如果有可能會有這樣的事情,或其他任何可能導致這樣的問題?也許有一種有效的方法來處理這種許多起始節點但簡單匹配條件查詢?

我想堅持到Cypher支架,如果有可能,因爲我覺得它優雅的表現,如果問題是其他地方:)

+1

多長時間需要時,你只是請執行'START x = node:nodes(lemma =「buy」)return count(*)'。您的Neo4j服務器運行多少內存?您的查詢返回多少行? –

+0

不應該是那些50k條目同一個節點?如果你尋找那個單詞? –

回答

0

既然你是在2.0.0-M06也將是巨大的,在這裏使用標籤怎麼樣?

不知道有關圖形模型的細節,但可以嘗試使用引理的值作爲標籤。在這種情況下,您的查詢看起來像:

MATCH (x:buy)-[:NEXT]->y-[:NEXT]->z RETURN x,y,z 

另一個想法是有一類節點lemma=buy。所有涉及此的節點都與類別節點有關係。爲了區分類別節點和其他節點,您也可以使用標籤。在這種情況下,索引查找將只返回類別節點,你會基本上使用-圖索引:

MATCH (c:Category)<-[:HAS_CATEGORY]-(x)-[:NEXT]->y-[:NEXT]->z 
WHERE c.lemma = 'buy' 
RETURN x,y,z 

(這裏你應該用一個架構指數CREATE INDEX ON :Category(lemma)