Migration Guide

This guide explains how to migrate your data from Azure Digital Twins to AgeDigitalTwins.

This guide explains how to migrate your data from Azure Digital Twins to AgeDigitalTwins.

1. Deploy AgeDigitalTwins

First, deploy your AgeDigitalTwins environment. See the Deployment & Installation guide for instructions.

2. Migration Approaches

You can use the official Azure Digital Twins SDKs (Python, .NET, JavaScript) to copy models, twins, and relationships from your Azure Digital Twins instance to AgeDigitalTwins. This works for both self-hosted and hosted deployments.

Note: See Using Azure Digital Twins SDKs for authentication and setup details.

Example Migration Scripts

from azure.identity import AzureCliCredential
from azure.core.exceptions import HttpResponseError
from azure.digitaltwins.core import DigitalTwinsClient

source_uri = "https://sourceadt.api.weu.digitaltwins.azure.net/"
target_uri = "https://targetadt.api.digitaltwins.konnektr.io/"

try:
    credential = AzureCliCredential()
    source_service_client = DigitalTwinsClient(source_uri, credential)
    target_service_client = DigitalTwinsClient(target_uri, credential)

    # Copy Models
    models_query_result = source_service_client.list_models(
        include_model_definition=True
    )
    models = []
    for modeldata in models_query_result:
        models.append(modeldata.model)
    print(f"Pushing {len(models)} models")
    target_service_client.create_models(models)

    # Copy Digital Twins
    twins_query_result = source_service_client.query_twins("SELECT * FROM digitaltwins")
    for twin in twins_query_result:
        try:
            print(f"Pushing twin: {twin['$dtId']}")
            target_service_client.upsert_digital_twin(twin["$dtId"], twin)
        except HttpResponseError as e:
            print(f"Error pushing twin {twin['$dtId']}: {e.message}")

    # Copy Relationships
    relationships_query_result = source_service_client.query_twins(
        "SELECT * FROM relationships"
    )
    for rel in relationships_query_result:
        try:
            print(
                f"Pushing rel: {rel['$sourceId']} - {rel['$targetId']} - {rel['$relationshipId']}"
            )
            target_service_client.upsert_relationship(
                rel["$sourceId"], rel["$relationshipId"], rel
            )
        except HttpResponseError as e:
            print(
                f"Error pushing rel {rel['$sourceId']} - {rel['$targetId']} - {rel['$relationshipId']}: {e.message}"
            )

except HttpResponseError as e:
    print(f"\nThis script has caught an error: {e.message}")

How to Run

  • Install azure-identity and azure-digitaltwins-core via pip. Run with python copy_adt.py.

B. Exporting to JSON-LD and Importing using the Import Jobs API

For large migrations or when using the import API, you can export your data to a JSON-LD file and upload it to blob storage for import.

Example Export Script (Python)

from azure.identity import AzureCliCredential
from azure.digitaltwins.core import DigitalTwinsClient
import json

source_uri = "https://sourceadt.api.weu.digitaltwins.azure.net/"
credential = AzureCliCredential()
source_client = DigitalTwinsClient(source_uri, credential)

with open("export.jsonld", "w", encoding="utf-8") as f:
    # Write header
    f.write(json.dumps({"Section": "Header"}) + "\n")
    f.write(json.dumps({"fileVersion": "1.0.0"}) + "\n")

    # Export models
    for model in source_client.list_models(include_model_definition=True):
        f.write(json.dumps({"Section": "Models"}) + "\n")
        f.write(json.dumps(model.model) + "\n")

    # Export twins
    for twin in source_client.query_twins("SELECT * FROM digitaltwins"):
        f.write(json.dumps({"Section": "Twins"}) + "\n")
        f.write(json.dumps(twin) + "\n")

    # Export relationships
    for rel in source_client.query_twins("SELECT * FROM relationships"):
        f.write(json.dumps({"Section": "Relationships"}) + "\n")
        f.write(json.dumps(rel) + "\n")