我使用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)
}
}
如果2.1.3或2.1.4也出現這種情況,您可以快速嘗試嗎?有多少最新物業遺失? – 2014-10-02 10:18:24
噢,請不要使用batchDatabase?請使用'BatchInserters.inserter'批處理數據庫是本應該從未寫過的泄漏抽象:) – 2014-10-02 10:45:16
由於我遇到了2.1.4版本的問題,我剛剛從2.1.4切換到2.1.5。但兩者都表現出相同的效果。 – Rosswart 2014-10-02 11:46:38