2014-10-02 95 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,现在一切正常。