# webvowl/vowlgrapher architecture

> Architecture diagram of the GitHub repository webvowl/vowlgrapher, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/webvowl/vowlgrapher
- Repository: https://github.com/webvowl/vowlgrapher

## Overview

VOWLGrapher is a web-based OWL/RDF ontology visualization and exploration tool. Users load an ontology, have it parsed and converted into graph data, then inspect and interact with the visualization through filtering, custom SPARQL queries, metadata and selection details, and export. The README documents supported formats and optional loading from URLs and SPARQL endpoints, but the sampled source does not show the full loading, rendering, filtering, or export implementation. Those relationships are therefore shown as documented, unverified links where appropriate.

Main entry points: [`src/blocks/workbench.rs`](https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench.rs) (Workbench controls), [`crates/serializer/src/serializer_util/serialize_triple.rs`](https://github.com/webvowl/vowlgrapher/blob/main/crates/serializer/src/serializer_util/serialize_triple.rs) (Graph serialization), [`src/pages/home.rs`](https://github.com/webvowl/vowlgrapher/blob/main/src/pages/home.rs) (Visualization page), [`src/blocks/workbench/ontology_menu.rs`](https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench/ontology_menu.rs) (Ontology loading UI)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["Web interface"]
  node_app["Application routing<br/>[app.rs]"]
  node_home["Visualization page<br/>[home.rs]"]
  node_workbench["Workbench controls<br/>[workbench.rs]"]
end

subgraph group_ingestion["Ontology ingestion"]
  node_ontology_menu["Ontology loading UI<br/>[ontology_menu.rs]"]
  node_file_upload["File upload<br/>[file_upload.rs]"]
  node_stored_ontology["Stored ontology input<br/>[stored_ontology.rs]"]
  node_parser["Ontology parser<br/>[parser_util.rs]"]
end

subgraph group_graph["Graph processing"]
  node_serializer["Graph serialization"]
  node_serializer_edges["Edge construction<br/>[edges.rs]"]
  node_serializer_nodes["Node construction<br/>[nodes.rs]"]
  node_renderer["Graph renderer"]
end

subgraph group_exploration["Graph exploration"]
  node_sidebar["Ontology sidebar<br/>[right_sidebar.rs]"]
  node_filtering["Type-based filtering<br/>[filter_menu.rs]"]
  node_query_ui["Custom query UI<br/>[query_menu.rs]"]
  node_query_input["Query graph input<br/>[internal_sparql.rs]"]
  node_query_assembly["SPARQL assembly<br/>[assembly.rs]"]
  node_export["Ontology export<br/>[export_menu.rs]"]
end

subgraph group_services["Backend services"]
  node_database[("Ontology storage<br/>[store.rs]")]
  node_error_log["Error reporting<br/>[errors.rs]"]
end

node_user(("Ontology user"))
node_endpoint{{"SPARQL endpoint"}}

node_user -.->|"opens"| node_app
node_app -->|"routes to"| node_home
node_home -->|"renders"| node_workbench
node_home -->|"renders"| node_sidebar
node_workbench -->|"renders"| node_ontology_menu
node_user -.->|"selects input"| node_ontology_menu
node_ontology_menu -.->|"offers upload"| node_file_upload
node_ontology_menu -.->|"offers stored input"| node_stored_ontology
node_file_upload -.->|"submits ontology"| node_parser
node_stored_ontology -.->|"submits ontology"| node_parser
node_parser -.->|"provides parsed data"| node_serializer
node_serializer -.->|"constructs nodes"| node_serializer_nodes
node_serializer -.->|"constructs edges"| node_serializer_edges
node_serializer -.->|"provides graph data"| node_renderer
node_renderer -.->|"renders visualization"| node_home
node_workbench -->|"renders"| node_filtering
node_workbench -->|"renders"| node_query_ui
node_query_ui -->|"assembles query"| node_query_assembly
node_query_ui -->|"loads query result"| node_query_input
node_query_input -.->|"updates graph"| node_renderer
node_endpoint -.->|"supplies query data"| node_query_input
node_workbench -->|"renders"| node_export
node_user -.->|"requests export"| node_export
node_renderer -.->|"provides graph selection"| node_sidebar
node_parser -.->|"stores ontology"| node_database
node_workbench -.->|"displays errors"| node_error_log

click node_app "https://github.com/webvowl/vowlgrapher/blob/main/src/app.rs"
click node_home "https://github.com/webvowl/vowlgrapher/blob/main/src/pages/home.rs"
click node_workbench "https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench.rs"
click node_ontology_menu "https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench/ontology_menu.rs"
click node_file_upload "https://github.com/webvowl/vowlgrapher/blob/main/src/components/user_input/file_upload.rs"
click node_stored_ontology "https://github.com/webvowl/vowlgrapher/blob/main/src/components/user_input/stored_ontology.rs"
click node_parser "https://github.com/webvowl/vowlgrapher/blob/main/crates/parser/src/parser_util.rs"
click node_serializer "https://github.com/webvowl/vowlgrapher/blob/main/crates/serializer/src/serializer_util/serialize_triple.rs"
click node_serializer_edges "https://github.com/webvowl/vowlgrapher/blob/main/crates/serializer/src/serializer_util/edges.rs"
click node_serializer_nodes "https://github.com/webvowl/vowlgrapher/blob/main/crates/serializer/src/serializer_util/nodes.rs"
click node_sidebar "https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/right_sidebar.rs"
click node_filtering "https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench/filter_menu.rs"
click node_query_ui "https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench/query_menu.rs"
click node_query_input "https://github.com/webvowl/vowlgrapher/blob/main/src/components/user_input/internal_sparql.rs"
click node_query_assembly "https://github.com/webvowl/vowlgrapher/blob/main/crates/sparql_queries/src/assembly.rs"
click node_export "https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench/export_menu.rs"
click node_database "https://github.com/webvowl/vowlgrapher/blob/main/crates/database/src/store.rs"
click node_error_log "https://github.com/webvowl/vowlgrapher/blob/main/src/errors.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_home,node_workbench,node_user toneBlue
class node_ontology_menu,node_file_upload,node_stored_ontology,node_parser toneAmber
class node_serializer,node_serializer_edges,node_serializer_nodes,node_renderer toneMint
class node_sidebar,node_filtering,node_query_ui,node_query_input,node_query_assembly,node_export toneRose
class node_database,node_error_log,node_endpoint toneIndigo
```

## Components

### Web interface

- [Application routing](https://github.com/webvowl/vowlgrapher/blob/main/src/app.rs): `src/app.rs`
- [Visualization page](https://github.com/webvowl/vowlgrapher/blob/main/src/pages/home.rs): `src/pages/home.rs`
- [Workbench controls](https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench.rs): `src/blocks/workbench.rs`

### Ontology ingestion

- [Ontology loading UI](https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench/ontology_menu.rs): `src/blocks/workbench/ontology_menu.rs`
- [File upload](https://github.com/webvowl/vowlgrapher/blob/main/src/components/user_input/file_upload.rs): `src/components/user_input/file_upload.rs`
- [Stored ontology input](https://github.com/webvowl/vowlgrapher/blob/main/src/components/user_input/stored_ontology.rs): `src/components/user_input/stored_ontology.rs`
- [Ontology parser](https://github.com/webvowl/vowlgrapher/blob/main/crates/parser/src/parser_util.rs): `crates/parser/src/parser_util.rs`

### Graph processing

- [Graph serialization](https://github.com/webvowl/vowlgrapher/blob/main/crates/serializer/src/serializer_util/serialize_triple.rs): `crates/serializer/src/serializer_util/serialize_triple.rs`
- [Edge construction](https://github.com/webvowl/vowlgrapher/blob/main/crates/serializer/src/serializer_util/edges.rs): `crates/serializer/src/serializer_util/edges.rs`
- [Node construction](https://github.com/webvowl/vowlgrapher/blob/main/crates/serializer/src/serializer_util/nodes.rs): `crates/serializer/src/serializer_util/nodes.rs`
- **Graph renderer**

### Graph exploration

- [Ontology sidebar](https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/right_sidebar.rs): `src/blocks/right_sidebar.rs`
- [Type-based filtering](https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench/filter_menu.rs): `src/blocks/workbench/filter_menu.rs`
- [Custom query UI](https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench/query_menu.rs): `src/blocks/workbench/query_menu.rs`
- [Query graph input](https://github.com/webvowl/vowlgrapher/blob/main/src/components/user_input/internal_sparql.rs): `src/components/user_input/internal_sparql.rs`
- [SPARQL assembly](https://github.com/webvowl/vowlgrapher/blob/main/crates/sparql_queries/src/assembly.rs): `crates/sparql_queries/src/assembly.rs`
- [Ontology export](https://github.com/webvowl/vowlgrapher/blob/main/src/blocks/workbench/export_menu.rs): `src/blocks/workbench/export_menu.rs`

### Backend services

- [Ontology storage](https://github.com/webvowl/vowlgrapher/blob/main/crates/database/src/store.rs): `crates/database/src/store.rs`
- [Error reporting](https://github.com/webvowl/vowlgrapher/blob/main/src/errors.rs): `src/errors.rs`

### Other components

- **Ontology user**
- **SPARQL endpoint**

## Connections

- Ontology user → Application routing: opens
- Application routing → Visualization page: routes to (evidence: `src/app.rs`)
- Visualization page → Workbench controls: renders (evidence: `src/pages/home.rs`)
- Visualization page → Ontology sidebar: renders (evidence: `src/pages/home.rs`)
- Workbench controls → Ontology loading UI: renders (evidence: `src/blocks/workbench.rs`)
- Ontology user → Ontology loading UI: selects input
- Ontology loading UI → File upload: offers upload
- Ontology loading UI → Stored ontology input: offers stored input
- File upload → Ontology parser: submits ontology
- Stored ontology input → Ontology parser: submits ontology
- Ontology parser → Graph serialization: provides parsed data
- Graph serialization → Node construction: constructs nodes
- Graph serialization → Edge construction: constructs edges
- Graph serialization → Graph renderer: provides graph data
- Graph renderer → Visualization page: renders visualization
- Workbench controls → Type-based filtering: renders (evidence: `src/blocks/workbench.rs`)
- Workbench controls → Custom query UI: renders (evidence: `src/blocks/workbench.rs`)
- Custom query UI → SPARQL assembly: assembles query (evidence: `src/blocks/workbench/query_menu.rs`)
- Custom query UI → Query graph input: loads query result (evidence: `src/blocks/workbench/query_menu.rs`)
- Query graph input → Graph renderer: updates graph
- SPARQL endpoint → Query graph input: supplies query data
- Workbench controls → Ontology export: renders (evidence: `src/blocks/workbench.rs`)
- Ontology user → Ontology export: requests export
- Graph renderer → Ontology sidebar: provides graph selection
- Ontology parser → Ontology storage: stores ontology
- Workbench controls → Error reporting: displays errors (evidence: `src/blocks/workbench.rs`)
