Vector Indexing causes Inconsistency, resulting in server start failure in read-only mode

Neo4j vector indexes cause inconsistency, therefore it can't start in read-only mode. The behavior happens in both systems:

Neo4j Version: 5.24.2 / 5.26.0
Operating System: Ubuntu 22 / Debian 12
Installation Method: Ubuntu / Debian repository

Steps to reproduce

  1. Have a database with no inconsistency errors (neo4j-admin database check neo4j)
  2. Apply vector indexing without any errors, such as:
CREATE VECTOR INDEX BiokeenEmbeddings IF NOT EXISTS
FOR (m:Pathway)
ON m.biokeen_embedding
OPTIONS {indexConfig: {
`vector.dimensions`: 200,
`vector.similarity_function`: 'cosine'
}}
  1. Set the database to read_only mode in neo4j.conf.

Expected behavior

Start the neo4j as usual in read-only mode.

Actual behavior

Neo4j database starts, but can't be reached nor queried by the browser or drivers. The neo4j database is offline. The database becomes online only if it's not read only, alternating between read-only and normal modes does not help. Removing the indexes help. Here are several logs & reports:

debug.log

Caused by: org.neo4j.kernellifecycle.LifecycleException: Component 'org.neo4j.kernel.impl.api.index.IndexingService@lb68e626' was successfully initialized, but failed to start.
Please see the attached cause exception: Some indexes need to be rebuilt. This is not allowed in read only mode. Please start db in writable mode to rebuild indexes. Indexes needing rebuild:
{
    Index(id=5, name='NtEmbeddings', type='VECTOR', schema=(:Label[6] {PropertyKey[24]}), indexProvider='vector-2.0'),
    Index(id=6, name='Anc2vecEmbeddings', type='VECTOR', schema=(:Label[1] {PropertyKey[1]}), indexProvider='vector-2.0'),
    Index(id=7, name='BiokeenEmbeddings', type='VECTOR', schema=(:Label[7] {PropertyKey[28]}), indexProvider='vector-2.0'), 
    Index(id=8, name='CadaEmbeddings', type='VECTOR', schema=(:Label[10] {PropertyKey[52]}), indexProvider='vector-2.0'), 
    Index(id=9, name='Prott5Embeddings', type='VECTOR', schema=(:Label[8] {PropertyKey[35]}), indexProvider='vector-2.0'), 
    Index(id=10, name='Esm2Embeddings', type='VECTOR', schema=(:Label[8] {PropertyKey[36]}), indexProvider='vector-2.0'), 
    Index(id=11, name='Dom2vecEmbeddings', type='VECTOR', schema=(:Label[2] {PropertyKey[8]}), indexProvider='vector-2.0'), 
    Index(id=12, name='selformerEmbeddins', type='VECTOR', schema=(:Label[4] {PropertyKey[20]}), indexProvider='vector-2.0')
    }.

at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:364) -[neo4j-common-5.26.0.jar:5.26.0]
at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:91) -[neo4j-common-5.26.0.jar:5.26.0]
at org.neo4j.kernel.database.AbstractDatabase.start(AbstractDatabase.java:169) -[neo4j-kernel-5.26.0.jar:5.26.0]
... 11 more

Caused by: java.lang.IllegalStateException: Some indexes need to be rebuilt. This is not allowed in read only mode. Please start db in writable mode to rebuild indexes. Indexes needing rebuild:
{
    Index(id=5, name='NtEmbeddings', type='VECTOR', schema =(:Label[6] {PropertyKey[24]}), indexProvider='vector-2.0'), 
    Index(id=6, name='Anc2vecEmbeddings', type='VECTOR', schema=(:Label[1] {PropertyKey[1]}), indexProvider='vector-2.0'), 
    Index(id=7, name='BiokeenEmbeddings', type='VECTOR', schemam(:Labe 1[7] {PropertyKey[28]}), indexProvider='vector-2.0'), 
    Index(id=8, name='CadaEmbeddings', type='VECTOR', schema=(:Label[10] {PropertyKey[52]}), indexProvider='vector-2.0'), 
    Index(id=9, name='Prott5Embeddings', type='VECTOR', schema=(:Label[8] {Pro pertyKey[35]}), indexProvider='vector-2.0'), 
    Index(id=10, name='Esm2Embeddings', type='VECTOR', schema=(:Label[8] {PropertyKey[36]}), indexProvider='vector-2.0'), 
    Index(id=11, name='Dom2vecEmbeddings', type='VECTOR', schema=(:Label[2] {PropertyKey[8]}), indexProvider='vector-2.0'), 
    Index(id=12, name='SelformerEmbeddings', type='VECTOR', schema=(:Label[4] {PropertyKey[20]}), indexProvider='vector-2.0')
}
at org.neo4j.kernel.impl.api.index.IndexingService.dontRebuildIndexesInReadOnlyMode(IndexingService.java:420) -[neo4j-kernel-5.26.0.jar:5.26.0]
at org.neo4j.kernel.impl.api.index.IndexingService.lambda$start$3(IndexingService.java:312) -[neo4j-kernel-5.26.0.jar:5.26.0]
at org.neo4j.kernel.impl.api.index.IndexMapReference.modify(IndexMapReference.java:48) -[neo4j-kernel-5.26.0.jar:5.26.0]
at org.neo4j.kernel.impl.api.index.IndexingService.start(IndexingService.java:289) -[neo4j-kernel-5.26.0.jar:5.26.0]
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:347) -[neo4j-common-5.26.0.jar:5.26.0]
at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:91) -[neo4j-common-5.26.0.jar:5.26.0]
at org.neo4j.kernel.database.AbstractDatabase.start(AbstractDatabase.java:169) -[neo4j-kernel-5.26.0.jar:5.26.0]
... 11 more

inconsistencies-2025-04-27.13.41.28.report

2025-04-27 10:41:30.336+0000 WARN  The schema rule has a reference to another schema rule that is not online.
    SchemaRecord[4,used=true,created=false,nextProp=9986963,constraint=false,secondaryUnitId-1,fixedReferences=false] (Index( id=4, name='Esm2Embeddings', type='VECTOR', schema=(:Protein {esm2_embedding}), indexProvider='vector-2.0' ))
    Inconsistent with: Index( id=4, name='Esm2Embeddings', type='VECTOR', schema=(:Label[8] {PropertyKey[36]}), indexProvider='vector-2.0' )
2025-04-27 10:41:30.337+0000 WARN  The schema rule has a reference to another schema rule that is not online.
    SchemaRecord[5,used=true,created=false,nextProp=9986951,constraint=false,secondaryUnitId-1,fixedReferences=false] (Index( id=5, name='CadaEmbeddings', type='VECTOR', schema=(:Phenotype {cada_embedding}), indexProvider='vector-2.0' ))
    Inconsistent with: Index( id=5, name='CadaEmbeddings', type='VECTOR', schema=(:Label[10] {PropertyKey[52]}), indexProvider='vector-2.0' )
2025-04-27 10:41:30.337+0000 WARN  The schema rule has a reference to another schema rule that is not online.
    SchemaRecord[7,used=true,created=false,nextProp=9986933,constraint=false,secondaryUnitId-1,fixedReferences=false] (Index( id=7, name='NtEmbeddings', type='VECTOR', schema=(:Gene {nt_embedding}), indexProvider='vector-2.0' ))
    Inconsistent with: Index( id=7, name='NtEmbeddings', type='VECTOR', schema=(:Label[6] {PropertyKey[24]}), indexProvider='vector-2.0' )
2025-04-27 10:41:30.337+0000 WARN  The schema rule has a reference to another schema rule that is not online.
    SchemaRecord[9,used=true,created=false,nextProp=9986945,constraint=false,secondaryUnitId-1,fixedReferences=false] (Index( id=9, name='BiokeenEmbeddings', type='VECTOR', schema=(:Pathway {biokeen_embedding}), indexProvider='vector-2.0' ))
    Inconsistent with: Index( id=9, name='BiokeenEmbeddings', type='VECTOR', schema=(:Label[7] {PropertyKey[28]}), indexProvider='vector-2.0' )
2025-04-27 10:41:30.338+0000 WARN  The schema rule has a reference to another schema rule that is not online.
    SchemaRecord[10,used=true,created=false,nextProp=9986969,constraint=false,secondaryUnitId-1,fixedReferences=false] (Index( id=10, name='Dom2vecEmbeddings', type='VECTOR', schema=(:ProteinDomain {dom2vec_embedding}), indexProvider='vector-2.0' ))
    Inconsistent with: Index( id=10, name='Dom2vecEmbeddings', type='VECTOR', schema=(:Label[2] {PropertyKey[8]}), indexProvider='vector-2.0' )
2025-04-27 10:41:30.338+0000 WARN  The schema rule has a reference to another schema rule that is not online.
    SchemaRecord[12,used=true,created=false,nextProp=9986957,constraint=false,secondaryUnitId-1,fixedReferences=false] (Index( id=12, name='Prott5Embeddings', type='VECTOR', schema=(:Protein {prott5_embedding}), indexProvider='vector-2.0' ))
    Inconsistent with: Index( id=12, name='Prott5Embeddings', type='VECTOR', schema=(:Label[8] {PropertyKey[35]}), indexProvider='vector-2.0' )
2025-04-27 10:41:30.338+0000 WARN  The schema rule has a reference to another schema rule that is not online.
    SchemaRecord[13,used=true,created=false,nextProp=9986975,constraint=false,secondaryUnitId-1,fixedReferences=false] (Index( id=13, name='SelformerEmbeddings', type='VECTOR', schema=(:SmallMolecule {selformer_embedding}), indexProvider='vector-2.0' ))
    Inconsistent with: Index( id=13, name='SelformerEmbeddings', type='VECTOR', schema=(:Label[4] {PropertyKey[20]}), indexProvider='vector-2.0' )

There may be small typos in the debug.log as I had to acquire with OCR.