2014-10-02 58 views
0

我使用BatchInserters.batchDatabase創建一個嵌入Neo4j的2.1.5數據的基礎上。當我只把一個的小數量的數據放進去,一切正常罰款BatchInserters.batchDatabase失敗 - 有時 - 默默地堅持節點屬性

但如果我增加投入數據的大小,的Neo4j未能堅持最新性能組具有的setProperty。在我調用shutdown之前,我可以用getProperty讀回這些屬性。當我用新的GraphDatabaseFactory()再次加載數據庫時,newEmbeddedDatabase會丟失那些合適的

奇怪的是,Neo4j不報告任何錯誤或拋出異常。所以我不知道什麼地方出了問題或在哪裏。 Java的應該有足夠的內存來處理這兩個小的數據庫(數據庫2.66 MIB,3000個節點,3000個關係)和大的(數據庫26.32 MIB,197267個節點,390659個關係)

這對我來說很難提取一個正在運行的示例來向您顯示問題,但如果這有幫助,我可以做。這裏主要步驟我這樣做,但:

def createDataBase(rules: AllRules) { 
    // empty the data base folder 
    deleteFileOrDirectory(new File(mainProjectPathNeo4j)) 

    // Create an index on some properties 
    db = new GraphDatabaseFactory().newEmbeddedDatabase(mainProjectPathNeo4j) 
    engine = new ExecutionEngine(db) 
    createIndex() 
    db.shutdown() 

    // Fill the data base 
    db = BatchInserters.batchDatabase(mainProjectPathNeo4j) 
    //createBatchIndex 
    try { 
    // Every function loads some data 
    loadAllModulesBatch(rules) 
    loadAllLinkModulesBatch(rules) 
    loadFormalModulesBatch(rules) 
    loadInLinksBatch() 
    loadHILBatch() 
    createStandardLinkModules(rules) 
    createStandardLinkSets(rules) 
    // validateModel shows the problem 
    validateModel(rules) 
    } catch { 
     // I want to see if my environment (BIRT) is catching any exceptions 
    case _ => val a = 7 
    } finally { 
    db.shutdown() 
    } 
} 

validateModel是更新某些特性已經創建的節點的

def validateModule(srcM: GenericModule) { 
    srcM.node.setProperty("isValidated", true) 
    assert(srcM.node == Neo4jScalaDataSource.testNode) 
    assert(srcM.node eq Neo4jScalaDataSource.testNode) 
    assert(srcM.node.getProperty("isValidated").asInstanceOf[Boolean]) 

當我終於用Cypher支架得到一些數據傳回 屬性由validateModel設置缺失

class Neo4jScalaDataSet extends ScriptedDataSetEventAdapter { 
    override def beforeOpen(...) { 
    result = Neo4jScalaDataSource.engine.profile(
     """ 
     MATCH (fm:FormalModule {isValidated: true}) RETURN fm.fullName as fullName, fm.uid as uid 
     """);  
    iter = result.iterator() 
} 

override def fetch(...) = { 
    if (iter.hasNext()) { 

    for (e <- iter.next().entrySet()) { 
    row.setColumnValue(e.getKey(), e.getValue()) 
    } 

    count += 1; 
    row.setColumnValue("count", count) 

    return true 
    } else { 
    logger.log(Level.INFO, result.executionPlanDescription().toString()) 
    return super.fetch(dataSet, row) 
    } 
} 
+0

如果2.1.3或2.1.4也出現這種情況,您可以快速嘗試嗎?有多少最新物業遺失? – 2014-10-02 10:18:24

+0

噢,請不要使用batchDatabase?請使用'BatchInserters.inserter'批處理數據庫是本應該從未寫過的泄漏抽象:) – 2014-10-02 10:45:16

+0

由於我遇到了2.1.4版本的問題,我剛剛從2.1.4切換到2.1.5。但兩者都表現出相同的效果。 – Rosswart 2014-10-02 11:46:38

回答

0

batchDatabase確實會導致此問題。 我已經切換到BatchInserters.inserter,現在一切正常。