Home

A problem with neo4j's db.schema()?

Updated:
Created:

Is there a problem with db.schema showing wrong results?

UPDATE: tl;dr: db.schema() is broken, use apoc.meta.schema() instead.

I have the following sample cypher, creating some nodes and some relations:

CREATE
    (footypeA:Footype {name:'FootypeA'}),
    (fooA:Foo  {name:'FooA'}),
    (fooB:Foo  {name:'FooB'}),
    (bartypeA:Bartype  {name:'BartypeA'}),
    (bartypeB:Bartype {name:'BartypeB'}),
    (barA:Bar {name:'BarA'}),
    (barB:Bar {name:'BarB'}),
    (fooA)-[:HAS_TYPE]->(footypeA),
    (fooB)-[:HAS_TYPE]->(footypeA),
    (barA)-[:HAS_TYPE]->(bartypeA),
    (barB)-[:HAS_TYPE]->(bartypeB);

This gives us some nodes and relations as in the image below, in the top section:

click to enlarge click to enlarge

But why, oh why, does the call to db.schema in the bottom section show us some ackward meta schema? Why does neo4j think that there is a "has_type" relation from a Foo to a Bartype? I mean, everybody knows that foos and bars are different things...

This is on neo4j-community-3.3.5.

UPDATE: And it turns out, this is a long known bug:

https://github.com/neo4j/neo4j/issues/9726

Workaround:

call apoc.meta.graph()

Silly me, I should have looked up the bug in the first place. Or maybe neo4j should have fixed it? Or changed their documentation?...