我有一个neo4j数据库,有几百万个节点和大约一样多的关系。在运行向其添加数据的程序时,JVM似乎崩溃了。当我后来尝试使用索引查询数据库时,它正常打开并检索了一些节点,但在某些时候返回了以下错误:
线程中的异常" main" org.neo4j.graphdb.NotFoundException: 找不到节点[20924]。这可能是因为其他人删除了这个 当我们试图从中读取属性时,或者因为 并发修改此实体上的其他属性。该 问题应该是暂时的。在 org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:601) 在 org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:579) 在 org.neo4j.kernel.impl.core.Primitive.hasProperty(Primitive.java:309) 在org.neo4j.kernel.impl.core.NodeImpl.hasProperty(NodeImpl.java:53) 在 org.neo4j.kernel.impl.core.NodeProxy.hasProperty(NodeProxy.java:160) 在 org.neo4j.cypher.internal.spi.gdsimpl.GDSBackedQueryContext $$匿名$ 1.hasProperty(GDSBackedQueryContext.scala:66) 在 org.neo4j.cypher.internal.spi.gdsimpl.GDSBackedQueryContext $$匿名$ 1.hasProperty(GDSBackedQueryContext.scala:48) 在 org.neo4j.cypher.internal.commands.Has.isMatch(Predicate.scala:203) 在 org.neo4j.cypher.internal.pipes.FilterPipe $$ anonfun $ internalCreateResults $ 1.适用(FilterPipe.scala:30) 在 org.neo4j.cypher.internal.pipes.FilterPipe $$ anonfun $ internalCreateResults $ 1.适用(FilterPipe.scala:30) 在scala.collection.Iterator $$ anon $ 14.hasNext(Iterator.scala:390)at scala.collection.Iterator $ class.foreach(Iterator.scala:727)at scala.collection.AbstractIterator.foreach(Iterator.scala:1156)at org.neo4j.cypher.internal.pipes.EagerAggregationPipe.internalCreateResults(EagerAggregationPipe.scala:76) 在 org.neo4j.cypher.internal.pipes.PipeWithSource.createResults(Pipe.scala:69) 在 org.neo4j.cypher.internal.pipes.PipeWithSource.createResults(Pipe.scala:66) 在 org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.org $ $ Neo4j的CYPHER $ $内部$ executionplan $$ ExecutionPlanImpl prepareStateAndResult(ExecutionPlanImpl.scala:164) 在 org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl $$ anonfun $ getLazyReadonlyQuery $ 1.适用(ExecutionPlanImpl.scala:139) 在 org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl $$ anonfun $ getLazyReadonlyQuery $ 1.适用(ExecutionPlanImpl.scala:138) 在 org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.execute(ExecutionPlanImpl.scala:38) 在org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:72) 在org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:67) 在 org.neo4j.cypher.javacompat.ExecutionEngine.execute(ExecutionEngine.java:66) at querygraph.BasicStatsQueries.main(BasicStatsQueries.java:54) 引起:org.neo4j.kernel.impl.nioneo.store.InvalidRecordException: PropertyRecord [11853043]未使用 org.neo4j.kernel.impl.nioneo.store.PropertyStore.getRecord(PropertyStore.java:453) 在 org.neo4j.kernel.impl.nioneo.store.PropertyStore.getLightRecord(PropertyStore.java:306) 在 org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.getPropertyRecordChain(ReadTransaction.java:185) 在 org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.loadProperties(ReadTransaction.java:215) 在 org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.nodeLoadProperties(ReadTransaction.java:239) 在 org.neo4j.kernel.impl.persistence.PersistenceManager.loadNodeProperties(PersistenceManager.java:111) 在 org.neo4j.kernel.impl.core.NodeManager.loadProperties(NodeManager.java:833) 在 org.neo4j.kernel.impl.core.NodeImpl.loadProperties(NodeImpl.java:143) 在 org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:596) ......还有23个
只有一个线程(至少,我开始)运行查询,它只是读取而不是写入。虽然异常声称它是临时的,但每次我尝试查询此索引时都会发生这种情况。因此,我认为它与坏关机有关。在我实施代码以防止这种情况之前,我在强制关闭之前遇到过数据库损坏,但neo4j始终能够恢复数据库,尽管需要一段时间。这似乎更糟糕。
当我手动循环索引并添加了try-catch时,它开始在上面列出的索引之后为索引中的每个节点返回错误。这是否意味着所有这些节点都不存在或已损坏?这意味着数据的重大(巨大)损失,因为索引中应该有大约一百万个节点。我该怎么做才能恢复数据库?
我正在使用1.9.2并希望升级到使用标签等,但我现在需要这个数据库用于一些时间紧迫的工作,而且现在没有时间改变任何重要的事情。
非常感谢您提供任何帮助。
答案 0 :(得分:1)
我建议备份数据库,然后删除并重新创建索引。
如果无法以编程方式删除索引,也可以删除目录下的目录
数据库关闭时/data/graph.db/index/lucene/node/<indexname>
。
然后,您可以使用
以编程方式重新索引节点for(Node n:GlobalGraphOperations.at(db).getAllNodes()){ if(node.hasProperty(“key”)) 。db.index()forNodes( “索引”)添加(节点, “钥匙”,node.getProperty( “钥匙”)); }
如果您能够获得分析数据库,那就太棒了。 非常感谢