Camunda + ARIS ↔ Knowledge Graph (bidirectional, OWL/RDF-native)¶
This is the end-to-end bridge between the process world (Software AG ARIS models and Camunda BPMN processes) and the agent-utilities Knowledge Graph. It is bidirectional and OWL/RDF-native: processes are ingested into the KG as canonical ArchiMate ontology objects and reasoned over, and the intelligence the KG accumulates is enriched back onto the live Camunda instances and ARIS models.
It is built almost entirely on machinery that already existed — the canonical ArchiMate ontology, the self-registering source-extractor framework, the OWL bridge, and the ontology reasoning driver — so this is mostly wiring, not new substrate. (CONCEPT:EG-KG.storage.nonblocking-checkpoint, CONCEPT:AU-KG.ingest.enterprise-source-extractor, CONCEPT:AU-KG.ontology.descriptive-process-world-gains, CONCEPT:AU-KG.research.best-effort-lightweight-never.)
The one ontology¶
Camunda, ARIS, and Egeria all fold into the same canonical ArchiMate
crosswalk (EG's core ArchiMate source, ontology_quant.ttl,
ontology_orchestration.ttl). There is no per-vendor schema:
| Concept | OWL class / property | Camunda source | ARIS source |
|---|---|---|---|
| Process | :BusinessProcess |
process definition | EPC / VAD model |
| Step | :BusinessTask (subClassOf :BusinessProcess) |
task/gateway | function / rule operator |
| Sequence flow | :flowsTo |
sequenceFlow |
control-flow connection |
| Same-process identity | :alignedWith (ALIGNED_WITH) |
egeria GUID / — | camundaKey / egeria GUID |
| Realizing workflow | :realizesProcess (REALIZES) |
— (compiled) | — (compiled) |
| Incident | :Incident (AFFECTS) |
incident | — |
| Data | :DataObject |
— | — |
Because the types are shared, an ARIS EPC process and its Camunda implementation
collapse to one identity under reasoning (via ALIGNED_WITH), and a single
query answers "show everything about this process" in either case of which tool it
came from.
Inbound — ingest processes INTO the KG¶
Inbound: process world → Knowledge Graph
Camunda 7/8 (Engine REST/Zeebe) feeds camunda-mcp's Api.v7, which feeds
extractors/camunda.py (BPMN XML lift). ARIS REST API (Connect/Cloud)
feeds aris-mcp's ArisApi, which feeds extractors/aris.py (EPC lift).
Both extractors produce an ExtractionBatch (BusinessProcess/
BusinessTask/FLOWS_TO), which materialize_source turns into a native
graph-slice ChangeEnvelope — one atomic governed commit into the
Knowledge Graph. After the commit, OntologyReasoningDriver's
OWLBridge.run_cycle reasons over the graph and feeds results back in.
- The extractors turn an injected vendor client into a uniform
ExtractionBatch.camunda.pyparses BPMN 2.0 XML;aris.pylifts the EPC (functions →BusinessTask, rule operators → gatewayBusinessTask, events collapsed, connections →FLOWS_TOwith branch conditions). materialize_source(engine, category, client)(enrichment/materialize.py) runs the registered extractor and persists the complete batch through nativeApplyChangeEnvelope, including policy, lineage, content version, and outbox in the same commit. It chooses materialize over the query-timeregister_rest_sourcevirtualization because cross-source reasoning (theALIGNED_WITHcrosswalk) needs the data persisted.- After the write,
OntologyReasoningDriver.extrapolate()promotes the new LPG types to OWL classes and runs one reasoning cycle, so the process structure is reasoned over natively (transitiveflowsTo,alignedWithidentity, governance attachment).
Surface: graph_ingest(action="materialize_source", corpus_name="camunda"|"aris")
(MCP) and POST /graph/ingest/materialize-source (REST).
Outbound — enrich data back INTO Camunda & ARIS¶
Outbound: Knowledge Graph → process world
The Knowledge Graph feeds gather_intelligence (per BusinessProcess),
producing a kg_intelligence payload + content hash. That payload splits
into _push_camunda (instance variables), which calls Camunda's
modify_process_instance_variables, and _push_aris (model attributes),
which calls ARIS's set_model_attributes.
gather_intelligence assembles four payloads per process, read through the
native graph view (the bounded execute surface is single-node-only, so edge reads go through
GraphComputeReader):
- Capability / code lineage — Workflows that
REALIZESthe process and what theyORCHESTRATES. - Ontology inferences —
ALIGNED_WITHtwins,governedBypolicies, and inferred relationships. - Operational signals —
Incidentnodes thatAFFECTSthe process. - Glossary / data lineage —
Conceptterms andDataObjectdata the process's tasks touch.
The payload is written under one namespaced key, kg_intelligence, as a Camunda
process-instance variable (Json) on every running instance, and/or an ARIS
model attribute. Writes are hash-idempotent (read-back, skip unchanged)
and individually fault-tolerant.
Surface: graph_analyze(action="process_writeback", target="camunda"|"aris"|"both")
(MCP) and POST /graph/analyze/process-writeback (REST). Gated by
KG_PROCESS_WRITEBACK (default off — it performs outbound mutations).
Components¶
| Piece | Location | Role |
|---|---|---|
| Camunda extractor | enrichment/extractors/camunda.py |
BPMN → KG |
| ARIS extractor | enrichment/extractors/aris.py |
EPC → KG |
| Materialize | enrichment/materialize.py |
run extractor + persist + reason |
| Process writeback | enrichment/process_writeback.py |
KG intelligence → Camunda/ARIS |
| Process compiler | process_plan_compiler.py |
BusinessProcess → executable Workflow |
| OWL bridge | core/owl_bridge.py |
promote LPG → OWL, reason |
| Reasoning driver | research/ara/reasoning_driver.py |
extrapolate() harvest |
| camunda-mcp | agents/camunda-mcp |
Camunda 7/8 REST client |
| aris-mcp | agents/aris-mcp |
ARIS REST client (read + gated write) |
Configuration¶
Connector connection/credentials live in each connector package's environment,
read by its auth.get_client():
- Camunda —
CAMUNDA_PLATFORM,CAMUNDA7_URL/CAMUNDA7_TOKEN/basic, or theCAMUNDA8_*Zeebe/Operate/Tasklist set. - ARIS —
ARIS_API_BASE, OAuth2 (ARIS_OAUTH_URL/ARIS_CLIENT_ID/ARIS_CLIENT_SECRET/ARIS_TENANT) orARIS_TOKEN/basic,ARIS_PATHS_JSONfor tenants whose REST layout differs, andARIS_ENABLE_WRITEfor outbound. - Outbound gate —
KG_PROCESS_WRITEBACK=1(agent-utilities) to enable writeback at all.
See Configuration Reference. For a guided, fully-configured setup, use the agent-utilities-process-integration skill.
Verification¶
# inbound, live (needs a Camunda 7 engine with a deployed definition)
CAMUNDA7_URL=https://camunda.example.test/engine-rest pytest -m live \
tests/integration/test_camunda_live.py
# unit
pytest tests/unit/knowledge_graph/enrichment/test_aris_extractor.py \
tests/unit/knowledge_graph/enrichment/test_materialize.py \
tests/unit/knowledge_graph/enrichment/test_process_writeback.py
End-to-end over the live surface: graph_ingest(action="materialize_source",
corpus_name="camunda") → KG gains bpmn_process:* / bpmn_task:* / FLOWS_TO
and reasoning runs → graph_analyze(action="process_writeback") → the
kg_intelligence variable appears on the running Camunda instances.