Add tags to digital twins

This article describes how to add different types of tags to models and digital twins, and how to query using the tags.

You can use the concept of tags to further identify and categorize your digital twins. In particular, users may want to replicate tags from existing systems, such as Haystack Tags, within their Azure Digital Twins instances.

This document describes patterns that can be used to implement tags on digital twins.

Tags are first added as properties within the model that describes a digital twin. That property is then set on the twin when it's created based on the model. After that, the tags can be used in queries to identify and filter your twins.

Marker tags

A marker tag is a simple string that is used to mark or categorize a digital twin, such as "blue" or "red". This string is the tag's name, and marker tags have no meaningful value—the tag is significant just by its presence (or absence).

Add marker tags to model

Marker tags are modeled as a DTDL Map from string to boolean. The boolean mapValue is ignored, as the presence of the tag is all that's important.

Here's an excerpt from a twin model implementing a marker tag as a property:

{
      "@type": "Property",
      "name": "tags",
      "schema": {
        "@type": "Map",
        "mapKey": {
          "name": "tagName",
          "schema": "string"
        },
        "mapValue": {
          "name": "tagValue",
          "schema": "boolean"
        }
      }
    },

Add marker tags to digital twins

Once the tags property is part of a digital twin's model, you can set the marker tag in the digital twin by setting the value of this property.

Here's a code example on how to set marker tags for a twin using the .NET SDK:

IDictionary<string, bool> tags = new Dictionary<string, bool>
{
    { "oceanview", true },
    { "VIP", true }
};
var twin = new BasicDigitalTwin
{
    Metadata = { ModelId = "dtmi:example:Room;1" },
    Contents =
    {
        { "Temperature", 75 },
        { "tags", tags },
    },
};
await client.CreateOrReplaceDigitalTwinAsync<BasicDigitalTwin>("myTwinID", twin);

After you create a twin with tag properties according to the example above, the twin will look like this:

{
  "$dtId": "myTwinID",
  "$etag": "W/\"e7429259-6833-46b4-b443-200a77a468c2\"",
  "$metadata": {
    "$model": "dtmi:example:Room;1",
    "Temperature": {
      "lastUpdateTime": "2021-08-03T14:24:42.0850614Z"
    },
    "tags": {
      "lastUpdateTime": "2021-08-03T14:24:42.0850614Z"
    }
  },
  "Temperature": 75,
  "tags": {
    "VIP": true,
    "oceanview": true
  }
}

Tip

You can see a twin's JSON representation by querying it with the CLI or APIs.

Query with marker tags

Once tags have been added to digital twins, the tags can be used to filter the twins in queries.

Here's a query to get all twins that have been tagged as "red":

SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(tags.red)

You can also combine tags for more complex queries. Here's a query to get all twins that are round, and not red:

SELECT * FROM DIGITALTWINS WHERE NOT IS_DEFINED(tags.red) AND IS_DEFINED(tags.round)

Value tags

A value tag is a key-value pair that is used to give each tag a value, such as "color": "blue" or "color": "red". Once a value tag is created, it can also be used as a marker tag by ignoring the tag's value.

Add value tags to model

Value tags are modeled as a DTDL Map from string to string. Both the mapKey and the mapValue are significant.

Here's an excerpt from a twin model implementing a value tag as a property:

{
  "@type": "Property",
  "name": "tags",
  "schema": {
    "@type": "Map",
    "mapKey": {
      "name": "tagName",
      "schema": "string"
    },
    "mapValue": {
      "name": "tagValue",
      "schema": "string"
    }
  }
}

Add value tags to digital twins

As with marker tags, you can set the value tag in a digital twin by setting the value of this tags property from the model. To use a value tag as a marker tag, you can set the tagValue field to the empty string value ("").

Below are the JSON bodies of two twins that have value tags to represent their sizes. The twins in the example also have value tags for "red" or "purple" that are being used as marker tags.

Example Twin1, with a value tag for size large and a marker tag of "red":

{
  "$dtId": "Twin1",
  "$etag": "W/\"d3997593-cc5f-4d8a-8683-957becc2bcdd\"",
  "$metadata": {
    "$model": "dtmi:example:ValueTags;1",
    "tags": {
      "lastUpdateTime": "2021-08-03T14:43:02.3150852Z"
    }
  },
  "tags": {
    "red": "",
    "size": "large"
  }
}

Example Twin2, with a value tag for size small and a marker tag of "purple":

{
  "$dtId": "Twin2",
  "$etag": "W/\"e215e586-b14a-4234-8ddb-be69ebfef878\"",
  "$metadata": {
    "$model": "dtmi:example:ValueTags;1",
    "tags": {
      "lastUpdateTime": "2021-08-03T14:43:53.1517123Z"
    }
  },
  "tags": {
    "purple": "",
    "size": "small"
  }
}

Query with value tags

As with marker tags, you can use value tags to filter the twins in queries. You can also use value tags and marker tags together.

From the example above, red is being used as a marker tag. Remember that this is a query to get all twins that have been tagged as "red":

SELECT * FROM DIGITALTWINS WHERE IS_DEFINED(tags.red)

Here's a query to get all entities that are small (value tag), and not red:

SELECT * FROM DIGITALTWINS WHERE NOT IS_DEFINED(tags.red) AND tags.size = 'small'

Next steps

Read more about designing and managing digital twin models:

Read more about querying the twin graph: