Neo4j 用import導入數據時報錯IdCapacityExceededException

今天用Neo4j導入數據的時候報錯了

Import error: Maximum id limit for RELATIONSHIP_TYPE_TOKEN has been reached. Generated id 92840 is out of permitted range [0, 65535].
Caused by:Maximum id limit for RELATIONSHIP_TYPE_TOKEN has been reached. Generated id 92840 is out of permitted range [0, 65535].
org.neo4j.kernel.impl.store.id.validation.IdCapacityExceededException: Maximum id limit for RELATIONSHIP_TYPE_TOKEN has been reached. Generated id 92840 is out of permitted range [0, 65535].
        at org.neo4j.kernel.impl.store.id.validation.IdValidator.assertIdWithinCapacity(IdValidator.java:90)
        at org.neo4j.kernel.impl.store.id.validation.IdValidator.assertValidId(IdValidator.java:68)
        at org.neo4j.kernel.impl.store.CommonAbstractStore.updateRecord(CommonAbstractStore.java:1114)
        at org.neo4j.kernel.impl.store.TokenStore.updateRecord(TokenStore.java:122)
        at org.neo4j.kernel.impl.store.TokenStore.updateRecord(TokenStore.java:46)
        at org.neo4j.unsafe.batchinsert.internal.DirectRecordAccess$DirectRecordProxy.store(DirectRecordAccess.java:205)        at org.neo4j.unsafe.batchinsert.internal.DirectRecordAccess.commit(DirectRecordAccess.java:239)
        at org.neo4j.unsafe.batchinsert.internal.DirectRecordAccess.close(DirectRecordAccess.java:225)
        at org.neo4j.unsafe.impl.batchimport.store.BatchingTokenRepository.flush(BatchingTokenRepository.java:193)
        at org.neo4j.unsafe.impl.batchimport.store.BatchingNeoStores.flushAndForce(BatchingNeoStores.java:472)
        at com.neo4j.unsafe.impl.batchimport.RestartableParallelBatchImporter.writeState(RestartableParallelBatchImporter.java:241)
        at com.neo4j.unsafe.impl.batchimport.RestartableParallelBatchImporter.runRemainingStates(RestartableParallelBatchImporter.java:235)
        at com.neo4j.unsafe.impl.batchimport.RestartableParallelBatchImporter.doImport(RestartableParallelBatchImporter.java:115)
        at org.neo4j.tooling.ImportTool.doImport(ImportTool.java:581)
        at org.neo4j.tooling.ImportTool.main(ImportTool.java:482)
        at org.neo4j.tooling.ImportTool.main(ImportTool.java:379)
        Suppressed: org.neo4j.kernel.impl.store.id.validation.IdCapacityExceededException: Maximum id limit for RELATIONSHIP_TYPE_TOKEN has been reached. Generated id 92840 is out of permitted range [0, 65535].
                at org.neo4j.kernel.impl.store.id.validation.IdValidator.assertIdWithinCapacity(IdValidator.java:90)
                at org.neo4j.kernel.impl.store.id.validation.IdValidator.assertValidId(IdValidator.java:68)
                at org.neo4j.kernel.impl.store.CommonAbstractStore.updateRecord(CommonAbstractStore.java:1114)
                at org.neo4j.kernel.impl.store.TokenStore.updateRecord(TokenStore.java:122)
                at org.neo4j.kernel.impl.store.TokenStore.updateRecord(TokenStore.java:46)
                at org.neo4j.unsafe.batchinsert.internal.DirectRecordAccess$DirectRecordProxy.store(DirectRecordAccess.java:205)
                at org.neo4j.unsafe.batchinsert.internal.DirectRecordAccess.commit(DirectRecordAccess.java:239)
                at org.neo4j.unsafe.batchinsert.internal.DirectRecordAccess.close(DirectRecordAccess.java:225)
                at org.neo4j.unsafe.impl.batchimport.store.BatchingTokenRepository.flush(BatchingTokenRepository.java:193)
                at org.neo4j.unsafe.impl.batchimport.store.BatchingNeoStores.flushAndForce(BatchingNeoStores.java:472)
                at org.neo4j.unsafe.impl.batchimport.store.BatchingNeoStores.close(BatchingNeoStores.java:378)
                at com.neo4j.unsafe.impl.batchimport.RestartableParallelBatchImporter.doImport(RestartableParallelBatchImporter.java:118)
                ... 3 more

WARNING Import failed. The store files in D:\Neo4jDesktop\neo4jDatabases\database-33f40f7d-7210-41ac-b6a9-8d17c0490379\installation-3.5.6\data\databases\graph.db are left as they are, although they are likely in an unusable state.
 Starting a database on these store files will likely fail or observe inconsistent records so start at your own risk or delete the store manually

後來在網上找到這裏

大概翻譯一下:

在運行創建新關係類型的語句時,例如:

MERGE (n1:Person {id:1})-[r:knows]->(n2:Person {id:2})

可能會遇到一個錯誤,錯誤日誌記錄:

2017-10-30 17:08:29.741+0000 ERROR [o.n.b.v.r.ErrorReporter] Client triggered an unexpected error [UnknownError]: Could not create token, reference 63c2e7ef-6f5b-4834-b2a8-fe74cac3a50a. Could not create token
org.neo4j.graphdb.TransactionFailureException: Could not create token
       at org.neo4j.kernel.impl.core.DelegatingTokenHolder.getOrCreateId(DelegatingTokenHolder.java:85)
       at org.neo4j.kernel.impl.api.store.StorageLayer.relationshipTypeGetOrCreateForName(StorageLayer.java:376)
       at org.neo4j.kernel.impl.api.StateHandlingStatementOperations.relationshipTypeGetOrCreateForName(StateHandlingStatementOperations.java:1384)
       at org.neo4j.kernel.impl.api.DataIntegrityValidatingStatementOperations.relationshipTypeGetOrCreateForName(DataIntegrityValidatingStatementOperations.java:86)
       at org.neo4j.kernel.impl.api.OperationsFacade.relationshipTypeGetOrCreateForName(OperationsFacade.java:774)
       at org.neo4j.cypher.internal.spi.v3_3.TransactionBoundQueryContext.getOrCreateRelTypeId(TransactionBoundQueryContext.scala:114)
       at org.neo4j.cypher.internal.compatibility.v3_3.ExceptionTranslatingQueryContext$$anonfun$getOrCreateRelTypeId$1.apply$mcI$sp(ExceptionTranslatingQueryContext.scala:203)
...
.....
........
       at org.neo4j.bolt.v1.runtime.concurrent.RunnableBoltWorker.run(RunnableBoltWorker.java:96)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
       at java.util.concurrent.FutureTask.run(FutureTask.java:266)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
       at java.lang.Thread.run(Thread.java:748)
       at org.neo4j.helpers.NamedThreadFactory$2.run(NamedThreadFactory.java:109)
Caused by: org.neo4j.kernel.impl.store.id.validation.IdCapacityExceededException: Record id 65536 is out of range [0, 65535]
       at org.neo4j.kernel.impl.store.id.validation.IdValidator.assertIdWithinCapacity(IdValidator.java:88)
       at org.neo4j.kernel.impl.store.id.validation.IdValidator.assertValidId(IdValidator.java:67)
       at org.neo4j.kernel.impl.store.id.IdGeneratorImpl.nextId(IdGeneratorImpl.java:143)
       at org.neo4j.kernel.impl.core.DefaultRelationshipTypeCreator.createKey(DefaultRelationshipTypeCreator.java:40)
       at org.neo4j.kernel.impl.core.IsolatedTransactionTokenCreator.getOrCreate(IsolatedTransactionTokenCreator.java:59)
       at org.neo4j.kernel.impl.core.DelegatingTokenHolder.createToken(DelegatingTokenHolder.java:103)
       at org.neo4j.kernel.impl.core.DelegatingTokenHolder.getOrCreateId(DelegatingTokenHolder.java:76)
       ... 49 more

上方記錄的關鍵部分是ID 65536 超出了區間 [0, 65535]

因爲超出了graph.db的最大關係類型數,導致這個錯誤發生。當前最大關係類型數是65536。注意,這只是用來限制“關係類型”的數量,而不是節點之間的關係數或圖中的總關係數。

遇到這個錯誤時,運行:

call db.relationshipTypes() yield relationshipType return count(relationshipType) as numRelTypes;

結果返回:

+-------------+
| numRelTypes |
+-------------+
| 65536       |
+-------------+

解決這個問題的方法,就是刪除不再使用的關係類型。目前Cypher語句無法完成這個任務。可以運行copy-store.sh,這個命令將讀取一個離線的graph.db並寫入一個新的graph.db,但排除所有不再使用的關係類型/屬性。

看完之後,發現錯誤原因,就是我的數據關係類型數超出了65536。

只能重新處理一下數據集,儘量減少關係類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章