Pipelined runtime times out on a small nested COUNT query with CSV and relationship-vector search
Environment
- Neo4j:
2026.07.1 - Cypher:
25 - Docker Community Edition
- Fresh database
fuzz.csvis readable by Neo4j and contains:
a,b
one,two
three,fourReproduction setup
Run this setup on an empty database:
DROP INDEX fuzz_node_vector_index IF EXISTS;
DROP INDEX fuzz_relationship_vector_index IF EXISTS;
CREATE VECTOR INDEX fuzz_node_vector_index
FOR (n:FuzzVector) ON n.embedding
OPTIONS {
indexConfig: {
`vector.dimensions`: 3,
`vector.similarity_function`: 'cosine'
}
};
CREATE VECTOR INDEX fuzz_relationship_vector_index
FOR ()-[r:FuzzVectorRel]-() ON r.embedding
OPTIONS {
indexConfig: {
`vector.dimensions`: 3,
`vector.similarity_function`: 'cosine'
}
};
CALL db.awaitIndexes();
CREATE (:FuzzVector {embedding: [1.0, 0.0, 0.0], rank: 1, active: true}),
(:FuzzVector {embedding: [0.0, 1.0, 0.0], rank: 2, active: false});
MATCH (a:FuzzVector), (b:FuzzVector)
WHERE a.rank = 1 AND b.rank = 2
CREATE (a)-[:FuzzVectorRel {embedding: [1.0, 0.0, 0.0], rank: 1}]->(b);
UNWIND range(0, 63) AS i
CREATE (:l0:l1:l2:l3:l4:l5:l6:l7:l8:l9:l10:l11 {
id: i,
k0: true,
k8: false,
k9: i = 63
});
UNWIND range(0, 63) AS i
MATCH (a {id: i}),
(b {id: CASE WHEN i = 63 THEN 0 ELSE i + 1 END})
CREATE (a)-[:rt9 {k8: false}]->(b);Reproduction query
Run the query twice, changing only runtime=pipelined to
runtime=slotted:
CYPHER runtime=pipelined
CREATE ()-[:rt9 {
k1: COUNT {
MATCH (), ({k0: true})-[r3 {k8: false}]-()
WHERE EXISTS {
CALL () {
LOAD CSV FROM 'file:///fuzz.csv' AS a
RETURN 1 AS x
}
SKIP 0
}
AND COUNT {
MATCH ()-[r5]->()
SEARCH r5 IN (VECTOR INDEX fuzz_relationship_vector_index FOR [1.0, 0.0, 0.0] LIMIT 3)
} >= 0
}
}]->()
RETURN 1 AS x;Actual behavior
With a 30-second transaction timeout on a fresh database:
runtime=slottedcompletes in about 3 seconds and returnsx = 1.runtime=pipelinedstill does not complete and is terminated with25N14:The transaction has not completed within the timeout specified at its start.
Expected behavior
Both runtimes should complete this valid query and return the same result. A runtime-specific timeout on this small graph should not occur.
Assessment
This is a performance regression candidate, not a Cypher syntax error or a
database crash. The trigger is the combination of a property-expression
COUNT subquery, a nested CALL containing LOAD CSV followed by SKIP 0,
and a relationship-vector search inside another COUNT predicate.
This is distinct from #13924:
#13924 reports a slotted slowdown for a nested COUNT + LOAD CSV shape,
whereas this reproduction isolates a pipelined-specific timeout involving a
relationship-vector search.
Source: neo4j/neo4j