BatchInserters.batchDatabase失败 - 有时 - 以静默方式保留节点属性

时间:2014-10-02 09:25:54

标签: neo4j

我使用 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)
   }
 } 

1 个答案:

答案 0 :(得分:0)

batchDatabase确实会导致此问题。 我已经切换到BatchInserters.inserter,现在一切正常。