StackMap
Subscribe
Explore / lpg-modeler
Volland

lpg-modeler

VS Code extension + CLI: author a labeled property graph schema as YAML on a canvas, then generate Neo4j, LadybugDB, Memgraph and FalkorDB schemas, SHACL, OWL, GQL, PG-Schema and LinkML.

35 3 TypeScript MITupdated 3 days ago
View on GitHubDispute this mapping →
Curator's take

Use it when one graph model has to live in several places — a Neo4j or LadybugDB store for the app, SHACL and OWL for the semantic side — and you're tired of syncing them by hand. The YAML is the source of truth, the canvas edits it with clean diffs, inheritance and mixins stay distinct, and anything a target can't enforce is flagged at the lossy line instead of silently dropped. It can also start from existing SHACL, OWL or LadybugDB DDL, and CI validation lets you gate PRs on schema validity. Skip it for schema-free graphs or LLM-extracted KGs whose shape you don't control; if you're RDF-first with no property-graph store, an OWL tool like open-ontologies fits better. Young project (tens of stars): pin the version.

Mapped by ShipWithAI editors · links verified

Continue your stack

What teams reach for next — and why each earns a place beside lpg-modeler. Ranked by curator confidence.

pairs wellpairs wellopen-ontologiessemanticalpg-modeler
pairs wellalternativebuilt withpick a node for the why · open it from the panel
Weekly digest
README.md2 min read

LPG Modeler

Design a property graph once. Generate every schema from it.

Documentation · Marketplace · Examples · Model format · Design notes

Marketplace version MIT licensed

A VS Code extension and CLI for authoring Labeled Property Graph schemas as text, viewing them as ERD-like diagrams, and generating database DDL and RDF artifacts from a single model.

One model, four artifacts

What it does

  • Authors the model as reviewable YAML, validated by a contributed JSON Schema — so completion and hover come from the YAML tooling you already have.
  • Edits it on a canvas beside the file. Every canvas action becomes a targeted text splice, applied as a workspace edit. Coordinates live in a sidecar, so moving a box produces no semantic diff.
  • Models inheritance and mixins as separate tools. An abstract label hierarchy says what a thing is and carries keys and edges down to every descendant; a mixin is a bag of properties a type applies, with no supertype and no identity. Both are flattened before any generator sees the model.
  • Generates nine targets from one model: LadybugDB DDL, Neo4j constraints, FalkorDB schema, Memgraph schema, SHACL shapes, and an OWL ontology — plus three standards artifacts, GQL graph types (ISO/IEC 39075), PG-Schema, and LinkML.
  • Imports what you already have. A model can start from a SHACL shapes graph, an OWL ontology or LadybugDB DDL rather than from an empty file. Several files are read together, because each carries what the others cannot — and whatever could not be recovered is reported rather than guessed.
  • Reports every downgrade. Anything a target cannot enforce becomes an editor diagnostic and a comment at the lossy line of the artifact. Nothing disappears quietly.
  • Models lists, enums, open types and cardinality — and cardinality is genuinely enforced where it can be: LadybugDB rejects a violating write, and SHACL bounds both directions.
  • Stays interoperable. The model file is self-describing, its scalar types answer to their GQL names, and the JSON Schema is 2020-12 — so a model is readable outside this tool, not only inside it.
  • Runs in CI. The same validation, with no editor present, so a pull request can be gated on schema validity.

Full feature tour: https://volland.github.io/lpg-modeler/

The editor

The canvas opens beside the model file, in the manner of Markdown preview. Every box is a node type, every row a property, and every action on it a targeted edit to the YAML.

The canvas, showing an abstract hierarchy and three mixins

This is fleet.lpg.yaml, one of the downloadable examples below. Asset and Vehicle are abstract — drawn with a dashed border and an abstract badge, and emitting no table. Truck sits three levels down: assetTag arrives from Asset, vin from Vehicle, and each inherited row names its source with ↑. Properties that came from a mixin are marked ◇ instead, because a supertype and a bag of properties are not the same claim about a type. STATIONED_AT is declared once on Asset and drawn on Asset alone: repeating it on fo