#13976·neo4j

db.schema.visualization() virtual nodes/relationships silently return null for their documented properties

Author: hkjiang26Created Sep 11, 2026Updated Sep 11, 2026
Labelsbugteam-cypherGithub Issue

Neo4j Version: neo4j:2026.07.1

Installation Method: Docker

API: Cypher (Bolt / HTTP)

Steps to reproduce

  1. Setup — run once on an empty database (one statement):
cypher
CREATE (:MyLabel {k:'a'}) CREATE (:MyLabel {k:'b'}) CREATE (:LabelA {k:'a'})-[:MY_REL]->(:LabelB {k:'b'})
  1. Then each statement below is complete and copy-pasteable on its own; run them one by one:

Bug — two property accessors in one projection, both come back null:

cypher
CALL db.schema.visualization() YIELD nodes UNWIND nodes AS n RETURN n.name AS a, n.indexes AS b

Control — same data via properties(n) is fine:

cypher
CALL db.schema.visualization() YIELD nodes UNWIND nodes AS n RETURN n.name AS a, properties(n) AS p

Control — a single property accessor works:

cypher
CALL db.schema.visualization() YIELD nodes UNWIND nodes AS n RETURN n.name AS a

Bug — relationship side, two property accessors also come back null:

cypher
CALL db.schema.visualization() YIELD relationships UNWIND relationships AS r RETURN r.name AS a, r.name AS b

Control — relationship single accessor works:

cypher
CALL db.schema.visualization() YIELD relationships UNWIND relationships AS r RETURN r.name AS a

Expected behavior

The procedure's own description (SHOW PROCEDURES) documents the properties on the returned objects: nodes expose name, indexes, constraints; relationships expose name. Those documented properties must be readable in any query shape — properties(n) in the very same row returns them, and a single accessor (RETURN n.name) works.

Actual behavior

Reading two or more properties in one projection silently returns null for all of them, while single accessors and properties(n) return the real values (a property predicate silently matches nothing):

RETURN n.name AS a, n.indexes AS b   => a = null, b = null
   (same row via properties(n): {name: "MyLabel", indexes: [], constraints: []})
RETURN r.name AS a, r.name AS b      => a = null, b = null   (relationship side)
RETURN n.name AS a                   => "MyLabel"            (control: single accessor works)
RETURN r.name AS a                   => "MY_REL"             (control: single accessor works)