#13937·neo4j

Pipelined runtime times out on a small nested COUNT query with CSV and relationship-vector search

Author: YGY-001Created Aug 22, 2026Updated Sep 14, 2026
Labelsbugteam-cypherGithub IssueFuzzy Bug2 Bug

Environment

  • Neo4j: 2026.07.1
  • Cypher: 25
  • Docker Community Edition
  • Fresh database
  • fuzz.csv is readable by Neo4j and contains:
a,b
one,two
three,four

Reproduction setup

Run this setup on an empty database:

cypher
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
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=slotted completes in about 3 seconds and returns x = 1.
  • runtime=pipelined still does not complete and is terminated with 25N14: 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.