我使用 BatchInserters.batchDatabase 创建嵌入式 Neo4j 2.1.5 数据库。当我只在其中添加少量数据时,一切正常正常。
但是,如果我增加放入的数据的大小, Neo4j无法持久使用setProperty设置的最新属性。在调用shutdown之前,我可以使用getProperty读回这些属性。当我使用新的GraphDatabaseFactory()。newEmbeddedDatabase再次加载数据库时,那些属性 。
这个奇怪的是 Neo4j没有报告任何错误或抛出异常。所以我不知道出了什么问题或在哪里。 Java应该有足够的内存来处理小数据库(数据库2.66 MiB ,3,000个节点,3,000个关系)和大数据库(数据库26.32 MiB ,197,267个节点,390,659关系)
我很难提取一个正在运行的示例来向您展示问题,但如果这有帮助我就能做到。我在这里做了主要步骤:
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 :(得分:0)
batchDatabase确实会导致此问题。 我已经切换到BatchInserters.inserter,现在一切正常。