db.schema.visualization() virtual nodes/relationships silently return null for their documented properties
Neo4j Version: neo4j:2026.07.1
Installation Method: Docker
API: Cypher (Bolt / HTTP)
Steps to reproduce
- Setup — run once on an empty database (one statement):
CREATE (:MyLabel {k:'a'}) CREATE (:MyLabel {k:'b'}) CREATE (:LabelA {k:'a'})-[:MY_REL]->(:LabelB {k:'b'})- 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:
CALL db.schema.visualization() YIELD nodes UNWIND nodes AS n RETURN n.name AS a, n.indexes AS bControl — same data via properties(n) is fine:
CALL db.schema.visualization() YIELD nodes UNWIND nodes AS n RETURN n.name AS a, properties(n) AS pControl — a single property accessor works:
CALL db.schema.visualization() YIELD nodes UNWIND nodes AS n RETURN n.name AS aBug — relationship side, two property accessors also come back null:
CALL db.schema.visualization() YIELD relationships UNWIND relationships AS r RETURN r.name AS a, r.name AS bControl — relationship single accessor works:
CALL db.schema.visualization() YIELD relationships UNWIND relationships AS r RETURN r.name AS aExpected 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)Source: neo4j/neo4j