{"id":50666087,"url":"https://github.com/dnv-opensource/cim-technical-workshop-dnv","last_synced_at":"2026-06-08T06:30:51.095Z","repository":{"id":340958254,"uuid":"1161572725","full_name":"dnv-opensource/cim-technical-workshop-dnv","owner":"dnv-opensource","description":"An interactive, hands-on workshop for learning how to work with CIM and CGMES files using Apache Jena, SPARQL, and SHACL.","archived":false,"fork":false,"pushed_at":"2026-02-27T12:10:22.000Z","size":584,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-27T15:07:47.570Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dnv-opensource.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-19T09:11:28.000Z","updated_at":"2026-02-27T12:10:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dnv-opensource/cim-technical-workshop-dnv","commit_stats":null,"previous_names":["dnv-opensource/cim-technical-workshop-dnv"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/dnv-opensource/cim-technical-workshop-dnv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dnv-opensource%2Fcim-technical-workshop-dnv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dnv-opensource%2Fcim-technical-workshop-dnv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dnv-opensource%2Fcim-technical-workshop-dnv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dnv-opensource%2Fcim-technical-workshop-dnv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dnv-opensource","download_url":"https://codeload.github.com/dnv-opensource/cim-technical-workshop-dnv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dnv-opensource%2Fcim-technical-workshop-dnv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34051768,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-08T06:30:44.028Z","updated_at":"2026-06-08T06:30:51.090Z","avatar_url":"https://github.com/dnv-opensource.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CIM/CGMES Technical Workshop\n\nAn interactive, hands-on workshop for learning how to work with CIM (Common Information Model) and CGMES (Common Grid Model Exchange Standard) files using Apache Jena, SPARQL, and SHACL.\n\n## Workshop Overview\n\nThis workshop teaches power system developers how to:\n\n- Import and manage CIM/CGMES files in graph databases\n- Query power grid data using SPARQL\n- Validate data quality using SHACL\n- Create custom validation rules\n\n## Workshop Structure\n\n**Total Duration:** 2 hours 30 minutes\n\n- Introduction: 8 minutes\n- Task 1: Data Import (15 min)\n- Task 2: Data Export (30 min)\n- Break: 5 minutes\n- Task 3: SPARQL Queries (45 min)\n- Break: 5 minutes\n- Task 4: SHACL Validation (30 min)\n- Wrap-up: 7 minutes\n- Buffer: 15 minutes\n\n### Task 1: Import CIM Files into Graph Database (15 min)\n\n**Scaffolded hands-on** - Implement 3 methods with provided structure and hints. One complete method provided as reference.\n\n### Task 2: Export CIM Data (30 min)\n\n**Scaffolded hands-on** - Implement 2 core methods for listing graphs and downloading from Fuseki. Optional bonus methods available.\n\n### Task 3: Query with SPARQL (45 min)\n\n**Scaffolded hands-on** - Write 4 SPARQL queries with progressive difficulty. Queries scaffolded from simple pattern filling to complex multi-hop paths.\n\n### Task 4: Validate with SHACL (30 min)\n\n**Scaffolded hands-on** - Implement 4 core validation methods with structured guidance. Focus on loading shapes and parsing validation reports.\n\n### Task 5: Create Custom SHACL Rules (Optional)\n\n**BONUS MATERIAL** - Advanced content for self-study after the workshop. Not included in the 2h 30min timeline.\n\n---\n\n## Prerequisites\n\n### Required Software\n\n- **Docker** and **Docker Compose** (to run Fuseki and Java environment)\n- **Git** (to clone the repository)\n\n### Recommended Knowledge\n\n- Basic understanding of:\n  - Power system concepts (optional but helpful)\n  - RDF/XML format basics\n  - Command line usage\n\n**Note:** No Java installation needed on your machine - everything runs in Docker!\n\n---\n\n## Quick Start\n\n### 1. Clone the Repository\n\n```bash\ngit clone \u003crepository-url\u003e\ncd cim-technical-workshop\n```\n\n### 2. Start the Workshop Environment\n\n```bash\ndocker-compose up -d\n```\n\nThis will start:\n\n- **Apache Jena Fuseki** (graph database) on `http://localhost:3030`\n- **Java workshop container** with all dependencies\n\n### 3. Enter the Workshop Container\n\n```bash\ndocker-compose exec workshop-java bash\n```\n\nYou're now in the workshop environment!\n\n### 4. Start with Task 1\n\n```bash\n# View the workshop menu\nmvn exec:java -Dexec.mainClass=\"com.cim.workshop.WorkshopRunner\"\n\n# Start Task 1\nmvn test -Dtest=Task1Test\n```\n\n---\n\n## Workshop Tasks\n\n### Task 1: Import CIM Files into Graph Database (15 min)\n\n**Scaffolded Exercise:**\n\n- One complete method provided: `extractModelId()` - study this to learn Jena API\n- Implement 3 methods with structure and hints provided\n\n**File to complete:** `src/main/java/com/cim/workshop/exercises/Task1_DataImport.java`\n\n**What you'll learn:**\n\n- How CIM files are structured (RDF/XML)\n- Extracting Model IDs (mRIDs) from CIM files\n- Loading files into Apache Jena models\n- Uploading to Fuseki as named graphs\n\n**Run tests:**\n\n```bash\nmvn test -Dtest=Task1Test\n```\n\n**Expected output:**\n\n- ✓ Extract Model ID from CIM file\n- ✓ Load CIM file into Jena Model\n- ✓ Upload model to Fuseki\n- ✓ Import entire directory\n\n---\n\n### Task 2: Export CIM Data (30 min)\n\n**Scaffolded Exercise:**\n\n- Implement 2 core methods with query and HTTP structures provided\n- 6 optional bonus methods available for extra practice\n\n**File to complete:** `src/main/java/com/cim/workshop/exercises/Task2_DataExport.java`\n\n**What you'll learn:**\n\n- Listing named graphs with SPARQL\n- Downloading graphs via HTTP GET\n- Graph Store Protocol for data export\n- Working with RDF/XML format\n\n**Run tests:**\n\n```bash\nmvn test -Dtest=Task2Test\n```\n\n**Expected output:**\n\n- ✓ List all named graphs\n- ✓ Download graph from Fuseki\n- Optional bonus methods for advanced export features\n\n---\n\n### Task 3: Query Datasets with SPARQL (45 min)\n\n**Scaffolded Exercise:**\n\n- Write 4 SPARQL queries with progressive difficulty\n- Query 1: Fill in 2 triple patterns\n- Query 2: Write complete WHERE clause with hints\n- Query 3: Apply FILTER NOT EXISTS pattern\n- Query 4: Complex multi-hop connectivity path\n\n**File to complete:** `src/main/java/com/cim/workshop/exercises/Task3_SparqlQueries.java`\n\n**What you'll learn:**\n\n- SPARQL query language basics\n- Finding resources by type\n- Following relationships in the graph\n- Identifying data errors with queries\n\n**Key Concepts:**\n\n- `SELECT` queries to retrieve data\n- Triple patterns for graph navigation\n- `FILTER NOT EXISTS` to find missing data\n- Multi-hop paths through connectivity nodes\n\n**Run tests:**\n\n```bash\nmvn test -Dtest=Task3Test\n```\n\n**Expected output:**\n\n- ✓ Query all ACLineSegments\n- ✓ Find terminals for ACLineSegments\n- ✓ Identify ACLineSegments without terminals\n- ✓ Find connected switches\n\n---\n\n### Task 4: Validate with SHACL (30 min)\n\n**Scaffolded Exercise:**\n\n- Implement 4 core validation methods with structured guidance\n- Load SHACL shapes, run validation, parse results\n- Optional bonus methods for advanced validation features\n\n**File to complete:** `src/main/java/com/cim/workshop/exercises/Task4_ShaclValidation.java`\n\n**What you'll learn:**\n\n- SHACL (Shapes Constraint Language) basics\n- Loading SHACL validation rules\n- Running validation against CIM data\n- Analyzing validation reports\n\n**Key Concepts:**\n\n- SHACL shapes define constraints\n- Validation produces reports with violations\n- ENTSO-E provides official CGMES SHACL rules\n- Violations indicate data quality issues\n\n**Run tests:**\n\n```bash\nmvn test -Dtest=Task4Test\n```\n\n**Expected output:**\n\n- ✓ Load SHACL shapes\n- ✓ Validate CIM data\n- ✓ Extract violation details\n- ✓ Parse validation reports\n\n---\n\n### Task 5: Create Custom SHACL Rules (Optional)\n\n**BONUS MATERIAL** - Self-study content, not included in 2h 30min workshop\n\n**File to complete:** `src/main/java/com/cim/workshop/exercises/Task5_CustomShacl.java`\n\n**What you'll learn:**\n\n- Creating SHACL shapes programmatically\n- Building property constraints\n- SHACL-SPARQL constraints\n- Connection between SHACL and SPARQL\n\n**Key Concepts:**\n\n- `sh:NodeShape` - defines a shape\n- `sh:targetClass` - specifies target class\n- `sh:property` - defines property constraints\n- `sh:sparql` - SPARQL-based validation\n\n**Run tests:**\n\n```bash\nmvn test -Dtest=Task5Test\n```\n\n**Expected output:**\n\n- ✓ Create basic SHACL shape\n- ✓ Create connectivity validation\n- ✓ Create SHACL-SPARQL constraint\n- ✓ Compare SHACL and SPARQL\n\n---\n\n## Workshop Data\n\n### CIM Files\n\nLocated in `assets/grid_model_cgmes/`:\n\n- **PowerFlow/** - Small dataset for testing\n- **FullGrid/** - Complete grid model\n\n### SHACL Rules\n\nLocated in `assets/shacl_cgmes/`:\n\n- ENTSO-E official CGMES validation rules\n- Multiple profiles (Equipment, Topology, StateVariables, etc.)\n\n---\n\n## Useful Commands\n\n### Run All Tests\n\n```bash\nmvn test\n```\n\n### Run Specific Task\n\n```bash\nmvn test -Dtest=Task1Test\nmvn test -Dtest=Task2Test\nmvn test -Dtest=Task3Test\nmvn test -Dtest=Task4Test\n```\n\n### Compile Project\n\n```bash\nmvn compile\n```\n\n### Clean Build\n\n```bash\nmvn clean compile\n```\n\n### Access Fuseki Web UI\n\nOpen browser: `http://localhost:3030`\n\n- Username: `admin`\n- Password: `admin`\n\n---\n\n## Troubleshooting\n\n### Fuseki Connection Error\n\n```bash\n# Restart Fuseki\ndocker-compose restart fuseki\n\n# Check Fuseki logs\ndocker-compose logs fuseki\n```\n\n### Maven Build Issues\n\n```bash\n# Clean and rebuild\nmvn clean install\n\n# Update dependencies\nmvn dependency:resolve\n```\n\n### Container Issues\n\n```bash\n# Restart all services\ndocker-compose down\ndocker-compose up -d\n\n# View logs\ndocker-compose logs\n```\n\n---\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────┐\n│                   Workshop Container                     │\n│  ┌────────────────────────────────────────────────┐    │\n│  │           Java Application (Maven)              │    │\n│  │  - Exercise files (Task1-4)                    │    │\n│  │  - Test suites                                  │    │\n│  │  - Apache Jena libraries                       │    │\n│  └────────────────────────────────────────────────┘    │\n│                         │                               │\n│                         ↓                               │\n│  ┌────────────────────────────────────────────────┐    │\n│  │        Apache Jena Fuseki (Graph DB)           │    │\n│  │  - Stores RDF graphs                           │    │\n│  │  - SPARQL endpoint                             │    │\n│  │  - Web UI (port 3030)                          │    │\n│  └────────────────────────────────────────────────┘    │\n└─────────────────────────────────────────────────────────┘\n                         │\n                         ↓\n              ┌──────────────────────┐\n              │    CIM/CGMES Files    │\n              │    SHACL Rules        │\n              │  (assets directory)   │\n              └──────────────────────┘\n```\n\n---\n\n## How Tests Work\n\nEach task has a test file that:\n\n1. **Checks if you've implemented methods** - throws error if method not implemented\n2. **Validates your implementation** - tests correctness with assertions\n3. **Provides feedback** - clear success/failure messages\n4. **Guides to next step** - tells you what to do next\n\n### Test-Driven Learning Flow\n\n```\n1. Run test → Method not implemented error\n2. Complete method in exercises/ file\n3. Run test → Passes with ✓\n4. Move to next method\n```\n\n---\n\n## Solutions\n\nSolution files are provided in the `src/main/java/com/cim/workshop/solutions/` directory. Try to complete tasks yourself first!\n\nTo view a solution:\n\n```bash\ncat src/main/java/com/cim/workshop/solutions/Task1_DataImport.java\n```\n\n---\n\n## Understanding the Code Structure\n\n```\ncim-technical-workshop/\n├── src/\n│   ├── main/java/com/cim/workshop/\n│   │   ├── exercises/              # YOUR WORK HERE\n│   │   │   ├── Task1_DataImport.java\n│   │   │   ├── Task2_SparqlQueries.java\n│   │   │   ├── Task3_ShaclValidation.java\n│   │   │   └── Task4_CustomShacl.java\n│   │   │\n│   │   ├── solutions/              # Reference solutions\n│   │   │   └── (same files as exercises/)\n│   │   │\n│   │   ├── WorkshopRunner.java     # Main menu\n│   │   └── utils/\n│   │       └── FusekiClient.java   # Fuseki helper\n│   │\n│   └── test/java/com/cim/workshop/\n│       ├── Task1Test.java          # Test suites\n│       ├── Task2Test.java\n│       ├── Task3Test.java\n│       └── Task4Test.java\n│\n├── assets/                 # Data files\n│   ├── grid_model_cgmes/  # CIM files\n│   └── shacl_cgmes/       # SHACL rules\n│\n├── docker-compose.yml     # Docker setup\n├── Dockerfile\n└── pom.xml               # Maven config\n```\n\n---\n\n## SPARQL Quick Reference\n\n### Basic Query Pattern\n\n```sparql\nPREFIX cim: \u003chttp://iec.ch/TC57/CIM100#\u003e\nPREFIX rdf: \u003chttp://www.w3.org/1999/02/22-rdf-syntax-ns#\u003e\n\nSELECT ?variable\nWHERE {\n    ?variable rdf:type cim:ClassName .\n}\n```\n\n### Find All ACLineSegments\n\n```sparql\nSELECT ?line ?name\nWHERE {\n    ?line rdf:type cim:ACLineSegment .\n    ?line cim:IdentifiedObject.name ?name .\n}\n```\n\n### Follow Relationships\n\n```sparql\nSELECT ?line ?terminal ?node\nWHERE {\n    ?line rdf:type cim:ACLineSegment .\n    ?terminal cim:Terminal.ConductingEquipment ?line .\n    ?terminal cim:Terminal.ConnectivityNode ?node .\n}\n```\n\n### Find Missing Data\n\n```sparql\nSELECT ?line ?name\nWHERE {\n    ?line rdf:type cim:ACLineSegment .\n    ?line cim:IdentifiedObject.name ?name .\n\n    FILTER NOT EXISTS {\n        ?terminal cim:Terminal.ConductingEquipment ?line .\n    }\n}\n```\n\n---\n\n## SHACL Quick Reference\n\n### Basic Shape Structure\n\n```turtle\n@prefix sh: \u003chttp://www.w3.org/ns/shacl#\u003e .\n@prefix cim: \u003chttp://iec.ch/TC57/CIM100#\u003e .\n\nshapes:ACLineSegmentShape\n    a sh:NodeShape ;\n    sh:targetClass cim:ACLineSegment ;\n    sh:property [\n        sh:path cim:Equipment.Terminal ;\n        sh:minCount 2 ;\n        sh:message \"ACLineSegment must have at least 2 terminals\" ;\n    ] .\n```\n\n### Common SHACL Properties\n\n- `sh:minCount` - Minimum number of values\n- `sh:maxCount` - Maximum number of values\n- `sh:class` - Expected type\n- `sh:datatype` - Expected datatype\n- `sh:pattern` - Regex pattern\n- `sh:sparql` - SPARQL constraint\n\n---\n\n## Key CIM Concepts\n\n### Equipment\n\n- `cim:ACLineSegment` - Power line segment\n- `cim:Switch` - Switching device\n- `cim:PowerTransformer` - Transformer\n\n### Connectivity\n\n- `cim:Terminal` - Connection point of equipment\n- `cim:ConnectivityNode` - Node where terminals meet\n- `cim:TopologicalNode` - Simplified connectivity\n\n### Relationships\n\n- `Terminal.ConductingEquipment` - Terminal → Equipment\n- `Terminal.ConnectivityNode` - Terminal → Node\n- `Equipment.EquipmentContainer` - Equipment → Container\n\n---\n\n## Additional Resources\n\n### CIM/CGMES Standards\n\n- [IEC 61970 (CIM)](https://en.wikipedia.org/wiki/IEC_61970)\n- [ENTSO-E CGMES](https://www.entsoe.eu/digital/common-information-model/)\n\n### Apache Jena\n\n- [Jena Documentation](https://jena.apache.org/documentation/)\n- [SPARQL Tutorial](https://jena.apache.org/tutorials/sparql.html)\n- [SHACL in Jena](https://jena.apache.org/documentation/shacl/)\n\n### SPARQL \u0026 SHACL\n\n- [SPARQL W3C Spec](https://www.w3.org/TR/sparql11-query/)\n- [SHACL W3C Spec](https://www.w3.org/TR/shacl/)\n\n---\n\n## Tips for Success\n\n1. **Read the comments** - Exercise files have detailed hints\n2. **Run tests frequently** - Get immediate feedback\n3. **Use the solutions** - Learn from examples when stuck\n4. **Explore Fuseki UI** - Visualize your data at http://localhost:3030\n5. **Ask questions** - Discuss with instructors and peers\n\n---\n\n## Workshop Completion\n\nAfter completing all tasks, you will be able to:\n\n- ✅ Import and manage CIM files in graph databases\n- ✅ Write SPARQL queries to analyze power grid data\n- ✅ Validate data quality with SHACL\n- ✅ Create custom validation rules\n- ✅ Understand the relationship between SHACL and SPARQL\n\n---\n\n## Cleanup\n\nWhen finished with the workshop:\n\n```bash\n# Stop containers\ndocker-compose down\n\n# Remove volumes (deletes database data)\ndocker-compose down -v\n\n# Remove images\ndocker-compose down --rmi all\n```\n\n---\n\n## Support\n\nIf you encounter issues:\n\n1. Check the Troubleshooting section\n2. Review test output carefully\n3. Consult solution files\n4. Ask workshop instructors\n\n---\n\n## License\n\nThis workshop is created for educational purposes.\n\nCIM/CGMES test data is provided by ENTSO-E.\n\n---\n\n**Ready to start?**\n\n```bash\ndocker-compose up -d\ndocker-compose exec workshop-java bash\nmvn test -Dtest=Task1Test\n```\n\nGood luck and enjoy the workshop! 🚀\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdnv-opensource%2Fcim-technical-workshop-dnv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdnv-opensource%2Fcim-technical-workshop-dnv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdnv-opensource%2Fcim-technical-workshop-dnv/lists"}