Basic Patterns

It is useful to have some common, basic patterns to follow when using a very open model and ontology. The following patterns have been agreed on as useful ways to think about our cultural data, through working with objects, entities and collections from across many different museums and organizations. They are foundational to all of Linked Art, and used extensively both to describe the core entities of interest (objects, works, people, places and so on) as well as within the descriptions (for example to give a label to a description, or a classification to a span of time).

These patterns are presented below with examples of how they are used in practice, but these are not intended to be exhaustive. The documentation for the different entity types will include more information about how they are used in different circumstances.

Core Properties

There are a few core properties that every resource must have for it to be a useful part of the world of Linked Art and Linked Open Usable Data (LOUD):

The classes used for the core entities we describe are summarized as below, with links to the full documentation about them:

Class Documentation Description
HumanMadeObject Objects Physical things you can touch, e.g. a painting
DigitalObject Digital Digital things that exist only in computers, e.g. a web page
Person Agents A human person, e.g. Rembrandt
Group Agents A group of people, capable of collective action, e.g. a museum department
Place Places A place, typically somewhere on earth that could have coordinates, e.g. Paris
VisualItem Visual Work Conceptual image/visual content shown by a physical or digital object, e.g. the image we know as "The Mona Lisa", as opposed to the physical painting
LinguisticObject Documents Textual content carried by a physical or digital object, e.g. the text of The Lord of the Rings
PropositionalObject Exhibitions An entirely abstract work that is neither linguistic nor visual, e.g. the notion of an exhibition or piece of performance art
Type Concepts A category, concept, or similar, e.g. centimeters or sculpting
Set Collection A set or collection of some number of other entities, e.g. a museum collection
Activity Provenance, Exhibitions An activity carried out by people or groups, e.g. an exhibition or the transfer of ownership of an object between parties

Example:

The simplest possible object description of "Spring" has a URI, a class and a label.

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/spring/1",
  "type": "HumanMadeObject",
  "_label": "Jeanne (Spring) by Manet"
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(object/spring/1) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Jeanne (Spring) by Manet''") class O1_4 literal;
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Types and Classifications

CIDOC-CRM, our underlying ontology, is a framework that must be extended via additional vocabularies and ontologies to be useful. The provided mechanism for doing this is the classified_as property, which refers to a term from a controlled vocabulary. This is in contrast to the type property described above, which is used for a limited number of core, ontological classes. The classified_as property is thus a way to be more specific about the sort of entity, while maintaining the core information as the class using type. Controlled vocabulary entries should not be used with type, nor classes used with classified_as. More than one classification can be associated with each entity, even classifications of the same general sort (such as multiple type of object classifications, or multiple nationalities for a person).

While any external vocabulary of terms can be used, the Getty's Art and Architecture Thesaurus is used whenever possible for consistency and that it is already widespread in the museum domain. The set of terms that have been identified as useful are listed in the community best-practices for recommendations, and within the documentation of the model when a particular choice is essential for interoperability.

Use cases for this pattern are in almost every example, but include:

Example:

The classification of "Spring" (an instance of the class HumanMadeObject) is a painting (aat:300033618), and an artwork (aat:300133025):

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/spring/2",
  "type": "HumanMadeObject",
  "_label": "Jeanne (Spring) by Manet",
  "classified_as": [
    {
      "id": "http://vocab.getty.edu/aat/300133025",
      "type": "Type",
      "_label": "Artwork"
    },
    {
      "id": "http://vocab.getty.edu/aat/300033618",
      "type": "Type",
      "_label": "Painting"
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(object/spring/2) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Jeanne (Spring) by Manet''") class O1_4 literal; O2(aat:300133025) class O2 type; O2-- type -->O2_0[Type] class O2_0 classstyle; O2-- _label -->O2_3("''Artwork''") class O2_3 literal; O1-- classified_as -->O2 O3(aat:300033618) class O3 type; O3-- type -->O3_0[Type] class O3_0 classstyle; O3-- _label -->O3_3("''Painting''") class O3_3 literal; O1-- classified_as -->O3
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

The classification of "Paris" (an instance of the class Place) is a city (aat:00008389):

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/place/paris/1",
  "type": "Place",
  "_label": "Paris",
  "classified_as": [
    {
      "id": "http://vocab.getty.edu/aat/300008389",
      "type": "Type",
      "_label": "City"
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(place/paris/1) class O1 place; O1-- type -->O1_0[Place] class O1_0 classstyle; O1-- _label -->O1_4("''Paris''") class O1_4 literal; O2(aat:300008389) class O2 type; O2-- type -->O2_0[Type] class O2_0 classstyle; O2-- _label -->O2_3("''City''") class O2_3 literal; O1-- classified_as -->O2
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Types of Types

A common pattern is to not only classify main entities, but also to classify the types themselves in order to know what sort of type it is, without recognizing all of them individually. This is important when the set of first degree types is not easily enumerable, such as classifications for the type of object or work. If the set of vocabulary terms that can normally be used without further extension can be established, then this pattern is not used. This is also not needed when the relationship from the entity to the first degree type clarifies this, such as the motivation or about properties.

Use cases for this pattern include:

Example:

The object is classified as being a Painting, and the concept "Painting" is for classifying the type of object (as opposed to any other sort of classification).

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/spring/3",
  "type": "HumanMadeObject",
  "_label": "Jeanne (Spring) by Manet",
  "classified_as": [
    {
      "id": "http://vocab.getty.edu/aat/300033618",
      "type": "Type",
      "_label": "Painting",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300435443",
          "type": "Type",
          "_label": "Type of Work"
        }
      ]
    },
    {
      "id": "http://vocab.getty.edu/aat/300133025",
      "type": "Type",
      "_label": "Artwork"
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(object/spring/3) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Jeanne (Spring) by Manet''") class O1_4 literal; O2(aat:300033618) class O2 type; O2-- type -->O2_0[Type] class O2_0 classstyle; O2-- _label -->O2_3("''Painting''") class O2_3 literal; O3(aat:300435443) class O3 type; O3-- type -->O3_0[Type] class O3_0 classstyle; O3-- _label -->O3_3("''Type of Work''") class O3_3 literal; O2-- classified_as -->O3 O1-- classified_as -->O2 O4(aat:300133025) class O4 type; O4-- type -->O4_0[Type] class O4_0 classstyle; O4-- _label -->O4_3("''Artwork''") class O4_3 literal; O1-- classified_as -->O4
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Rembrandt (a person) has a nationality of Dutch:

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/person/rembrandt/1",
  "type": "Person",
  "_label": "Rembrandt",
  "classified_as": [
    {
      "id": "http://vocab.getty.edu/aat/300388256",
      "type": "Language",
      "_label": "Dutch"
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(person/rembrandt/1) class O1 actor; O1-- type -->O1_0[Person] class O1_0 classstyle; O1-- _label -->O1_4("''Rembrandt''") class O1_4 literal; O2(aat:300388256) class O2 type; O2-- type -->O2_0[Language] class O2_0 classstyle; O2-- _label -->O2_3("''Dutch''") class O2_3 literal; O1-- classified_as -->O2
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Names and Identifiers for a Resource

Names

As the _label property is intended as internal documentation for the data, it is strongly recommended that every entity that should be rendered to an end user also have at least one specific name. The name could be for an object, a person, a group, an event or anything else. This pattern uses the identified_by property, with a Name construct. The value of the name is given in the content property of the Name.

It is somewhat unintuitive to think of a name as identifying the resource it is associated with, as names are typically not unique. However, as the name has its own class (Name) and could have an id, it is not just an anonymous string and thus no longer a shared label. Instead each name is the particular instance of a name which is uniquely associated with its entity. With this formulation, the name instance does uniquely identify the entity.

If there is more than one name given, then there should be one that is classified_as the primary name for use. This is done by adding the Primary Name (aat:300404670) term to it. There should be exactly one primary name given per language. Names are also part of human communication, and can have the Linguistic features of the model associated with them, such as having a particular language.

Example:

The primary name for "The Night Watch" is "The Night Watch" in English, and "De Nachtwacht" in Dutch:

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/nightwatch/1",
  "type": "HumanMadeObject",
  "_label": "Night Watch by Rembrandt",
  "identified_by": [
    {
      "type": "Name",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300404670",
          "type": "Type",
          "_label": "Primary Name"
        }
      ],
      "content": "The Night Watch",
      "language": [
        {
          "id": "http://vocab.getty.edu/aat/300388277",
          "type": "Language",
          "_label": "English"
        }
      ]
    },
    {
      "type": "Name",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300404670",
          "type": "Type",
          "_label": "Primary Name"
        }
      ],
      "content": "De Nachtwacht",
      "language": [
        {
          "id": "http://vocab.getty.edu/aat/300388256",
          "type": "Language",
          "_label": "Dutch"
        }
      ]
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(object/nightwatch/1) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Night Watch by Rembrandt''") class O1_4 literal; O2( _ ) class O2 name; O2-- type -->O2_0[Name] class O2_0 classstyle; O3(aat:300404670) class O3 type; O3-- type -->O3_0[Type] class O3_0 classstyle; O3-- _label -->O3_3("''Primary Name''") class O3_3 literal; O2-- classified_as -->O3 O2-- content -->O2_3("''The Night Watch''") class O2_3 literal; O4(aat:300388277) class O4 type; O4-- type -->O4_0[Language] class O4_0 classstyle; O4-- _label -->O4_3("''English''") class O4_3 literal; O2-- language -->O4 O1-- identified_by -->O2 O5( _ ) class O5 name; O5-- type -->O5_0[Name] class O5_0 classstyle; O5-- classified_as -->O3 O5-- content -->O5_3("''De Nachtwacht''") class O5_3 literal; O6(aat:300388256) class O6 type; O6-- type -->O6_0[Language] class O6_0 classstyle; O6-- _label -->O6_3("''Dutch''") class O6_3 literal; O5-- language -->O6 O1-- identified_by -->O5
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Identifiers

Many entities are also given external identifiers, such as accession numbers for objects, ORCIDs for people or groups, lot numbers for auctions, and so forth. Identifiers are represented in a very similar way to names, but instead use the Identifier class. Identifiers will normally have a classification determining which sort of identifier it is, to distinguish between internal repository system assigned numbers from museum assigned accession numbers, for example.

As Identifiers and Names use the same identified_by property, the JSON will frequently have mixed classes in the array. Unlike Names, Identifiers are not part of human language and thus cannot have a language associated with them.

Example:

The accession number identifier for "The Night Watch" is "SK-C-5":

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/nightwatch/2",
  "type": "HumanMadeObject",
  "_label": "Night Watch by Rembrandt",
  "identified_by": [
    {
      "type": "Identifier",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300312355",
          "type": "Type",
          "_label": "Accession Number"
        }
      ],
      "content": "SK-C-5"
    },
    {
      "type": "Name",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300404670",
          "type": "Type",
          "_label": "Primary Name"
        }
      ],
      "content": "The Night Watch"
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(object/nightwatch/2) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Night Watch by Rembrandt''") class O1_4 literal; O2( _ ) class O2 name; O2-- type -->O2_0[Identifier] class O2_0 classstyle; O3(aat:300312355) class O3 type; O3-- type -->O3_0[Type] class O3_0 classstyle; O3-- _label -->O3_3("''Accession Number''") class O3_3 literal; O2-- classified_as -->O3 O2-- content -->O2_3("''SK-C-5''") class O2_3 literal; O1-- identified_by -->O2 O4( _ ) class O4 name; O4-- type -->O4_0[Name] class O4_0 classstyle; O5(aat:300404670) class O5 type; O5-- type -->O5_0[Type] class O5_0 classstyle; O5-- _label -->O5_3("''Primary Name''") class O5_3 literal; O4-- classified_as -->O5 O4-- content -->O4_3("''The Night Watch''") class O4_3 literal; O1-- identified_by -->O4
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Equivalent Data URIs

Identifiers for the same entity within the web of linked data are treated differently from string identifiers such as accession numbers or ISBNs. In order to allow systems to follow the link and potentially process the information that they discover there, we use a new property equivalent to link out to other organizations' data about the same entity. For example, Rembrandt has a description in the Getty's ULAN vocabulary, in Wikidata, in the Library of Congress Name Authority File, and in OCLC's Virtual International Authority File, amongst many others. The URI given must identify the entity itself, rather than about page the entity. For example, in ULAN there is also the website version http://vocab.getty.edu/page/ulan/500011051 which must not be used with equivalent.

Note that equivalent can also be included when referencing resources across records in the API.

Example:

The Night Watch has an external URI that also identifies the same physical object in wikidata:

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/nightwatch/3",
  "type": "HumanMadeObject",
  "_label": "Night Watch by Rembrandt",
  "equivalent": [
    {
      "id": "https://www.wikidata.org/entity/Q219831",
      "type": "HumanMadeObject",
      "_label": "Night Watch"
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(object/nightwatch/3) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Night Watch by Rembrandt''") class O1_4 literal; O2(https://www.wikidata.org/entity/Q219831) class O2 object; O2-- type -->O2_0[HumanMadeObject] class O2_0 classstyle; O2-- _label -->O2_3("''Night Watch''") class O2_3 literal; O1-- equivalent -->O2
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Statements about an Entity

In many cases, current data does not support the level of specificity that the full ontology allows, or the information is simply best expressed in a human-readable form. For example, instead of a completely modeled set of parts with materials, many museum collection management systems allow only a single human-readable string for the "medium" or "materials statement". The same is true in many other situations, including rights or allowable usage statements, dimensions, edition statements and so forth. Any time that there is a description of the entity, with or without qualification as to the type of description, then this pattern can be used to record the descriptive text.

The pattern makes use of the LinguisticObject class that is used to identify a particular piece of textual content. These Linguistic Objects are then refered to by any other resource. They maintain the statement's text in the content property, and the language of the statement (if known) in the language property. If the content is not plain text, then using format to give the media type is recommended (e.g. "text/html" for HTML)

Use cases for this pattern include:

Note that both Names and Statements can have their own Names (e.g. "Former Title", "Supplied Description") and their own Statements (such as the source of the name or statement), however best practice is to only use these sparingly.

Example:

Having only a textual description of the materials in English, the content "Oil on Canvas" is recorded as referring to the painting as a "materials" (aat:300435429) statement:

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/nightwatch/4",
  "type": "HumanMadeObject",
  "_label": "Night Watch by Rembrandt",
  "referred_to_by": [
    {
      "type": "LinguisticObject",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300435429",
          "type": "Type",
          "_label": "Material Statement",
          "classified_as": [
            {
              "id": "http://vocab.getty.edu/aat/300418049",
              "type": "Type",
              "_label": "Brief Text"
            }
          ]
        }
      ],
      "content": "Oil on Canvas",
      "language": [
        {
          "id": "http://vocab.getty.edu/aat/300388277",
          "type": "Language",
          "_label": "English"
        }
      ]
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(object/nightwatch/4) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Night Watch by Rembrandt''") class O1_4 literal; O2( _ ) class O2 infoobj; O2-- type -->O2_0[LinguisticObject] class O2_0 classstyle; O3(aat:300435429) class O3 type; O3-- type -->O3_0[Type] class O3_0 classstyle; O3-- _label -->O3_3("''Material Statement''") class O3_3 literal; O4(aat:300418049) class O4 type; O4-- type -->O4_0[Type] class O4_0 classstyle; O4-- _label -->O4_3("''Brief Text''") class O4_3 literal; O3-- classified_as -->O4 O2-- classified_as -->O3 O2-- content -->O2_3("''Oil on Canvas''") class O2_3 literal; O5(aat:300388277) class O5 type; O5-- type -->O5_0[Language] class O5_0 classstyle; O5-- _label -->O5_3("''English''") class O5_3 literal; O2-- language -->O5 O1-- referred_to_by -->O2
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Events and Activities

Patterns are not only within a single entity, but also in the way that we manage relationships between entities. While many systems link straight from one an object to its creator, for example, Linked Art instead uses an intermediate entity that represents the activity of the artist in creating the object. This enables us to associate time, place, actors, techniques, other objects and more with the creation activity, rather than needing many individual relationships.

The key participants in those different types of events are:

The general pattern is to create a construct internal to the record for the event (with the class Event) or activity (with the class Activity or a more specific class), and associate the participants with that construct. The relationships for time (timespan) and place (took_place_at) are relevant to Events that happen without the direct cause being a human action, and the relationship for the actor (carried_out_by) is added to those for human activities. The relationship to the object is dependent on the type of event or activity, which are discussed in more detail in the specific sections.

There are both subclasses, such as Birth, Production and Creation, and classifications associated with them to be more specific, such as glassblowing (aat:300053932) to clarify the type or technique of the activity. There are three common categories of activity which are used across the different entity types: their beginning of existence, their end of existence, and core activities that they either performed (for people or groups) or were required for (for objects and works). The table below summaries the beginning and ending of existence classes per main entity class. Note that conceptual entities cannot have an end of existence, and Places have neither.

Class Beginning Ending
HumanMadeObject Production Destruction
DigitalObject Creation Erasure
LinguisticObject Creation None
VisualItem Creation None
PropositionalObject Creation None
Type Creation None
Set Creation None
Person Birth Death
Group Formation Dissolution

Example:

"Spring" was produced in a Production activity carried out by Manet in 1881, somewhere in France.

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/spring/4",
  "type": "HumanMadeObject",
  "_label": "Jeanne (Spring) by Manet",
  "produced_by": {
    "type": "Production",
    "timespan": {
      "type": "TimeSpan",
      "_label": "1881",
      "begin_of_the_begin": "1881-01-01T00:00:00",
      "end_of_the_end": "1881-12-31T23:59:59"
    },
    "took_place_at": [
      {
        "id": "https://linked.art/example/place/france",
        "type": "Place",
        "_label": "France"
      }
    ],
    "carried_out_by": [
      {
        "id": "https://linked.art/example/person/manet",
        "type": "Person",
        "_label": "Manet"
      }
    ]
  }
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(object/spring/4) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Jeanne (Spring) by Manet''") class O1_4 literal; O2( _ ) class O2 event; O2-- type -->O2_0[Production] class O2_0 classstyle; O3( _ ) class O3 timespan; O3-- type -->O3_0[TimeSpan] class O3_0 classstyle; O3-- _label -->O3_2("''1881''") class O3_2 literal; O3-- begin_of_the_begin -->O3_3("''1881-01-01T00:00:00''") class O3_3 literal; O3-- end_of_the_end -->O3_4("''1881-12-31T23:59:59''") class O3_4 literal; O2-- timespan -->O3 O4(place/france) class O4 place; O4-- type -->O4_0[Place] class O4_0 classstyle; O4-- _label -->O4_3("''France''") class O4_3 literal; O2-- took_place_at -->O4 O5(person/manet) class O5 actor; O5-- type -->O5_0[Person] class O5_0 classstyle; O5-- _label -->O5_3("''Manet''") class O5_3 literal; O2-- carried_out_by -->O5 O1-- produced_by -->O2
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Time Span Details

The minimal timespan model is given above, with just the begin_of_the_begin and an end_of_the_end properties to record the beginning of the span, and the end of the span. The end of the span is included in the span, and thus if the end_of_the_end is "1500-01-01T00:00:00Z", then the 1500 is included, and thus the timestamp should be "1499-12-31T23:59:59Z" for the last moment of the 1400s and not any of 1500.

The datestamps must be fully qualified with year, month, day, hour, minute and second. If a timezone is not supplied it should be assumed to be "Z" (GMT) to ensure comparisons work correctly. This is the "xsd:dateTime" profile of ISO8601.

It is very useful to have a Name for the TimeSpan that gives a human readable version of the machine readable timestamps and durations. This uses the pattern given above for naming things, and might be displayed to user directly, whereas the other properties could be used for matching a time-based search.

There are other properties for TimeSpan instances that are useful when the exact span of time is not certain.

Example:

The Christie's auction of the Stowe House took place over 40 days in August and September, 1848 (Source).

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/event/stowe/1",
  "type": "Activity",
  "_label": "Auction of Stowe House",
  "classified_as": [
    {
      "id": "http://vocab.getty.edu/aat/300054751",
      "type": "Type",
      "_label": "Auction Event"
    }
  ],
  "timespan": {
    "type": "TimeSpan",
    "identified_by": [
      {
        "type": "Name",
        "content": "40 days in August and September, 1848"
      }
    ],
    "begin_of_the_begin": "1848-08-01T00:00:00Z",
    "end_of_the_begin": "1848-08-20T23:59:59Z",
    "begin_of_the_end": "1848-09-09T00:00:00Z",
    "end_of_the_end": "1848-09-30T23:59:59Z",
    "duration": {
      "type": "Dimension",
      "value": 3,
      "unit": {
        "id": "http://vocab.getty.edu/aat/300379242",
        "type": "MeasurementUnit",
        "_label": "days"
      }
    }
  }
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(event/stowe/1) class O1 event; O1-- type -->O1_0[Activity] class O1_0 classstyle; O1-- _label -->O1_4("''Auction of Stowe House''") class O1_4 literal; O2(aat:300054751) class O2 type; O2-- type -->O2_0[Type] class O2_0 classstyle; O2-- _label -->O2_3("''Auction Event''") class O2_3 literal; O1-- classified_as -->O2 O3( _ ) class O3 timespan; O3-- type -->O3_0[TimeSpan] class O3_0 classstyle; O4( _ ) class O4 name; O4-- type -->O4_0[Name] class O4_0 classstyle; O4-- content -->O4_2("''40 days in August and September, 1848''") class O4_2 literal; O3-- identified_by -->O4 O3-- begin_of_the_begin -->O3_3("''1848-08-01T00:00:00Z''") class O3_3 literal; O3-- end_of_the_begin -->O3_4("''1848-08-20T23:59:59Z''") class O3_4 literal; O3-- begin_of_the_end -->O3_5("''1848-09-09T00:00:00Z''") class O3_5 literal; O3-- end_of_the_end -->O3_6("''1848-09-30T23:59:59Z''") class O3_6 literal; O5( _ ) class O5 dims; O5-- type -->O5_0[Dimension] class O5_0 classstyle; O5-- value -->O5_2(3) class O5_2 literal; O6(aat:300379242) class O6 type; O6-- type -->O6_0[MeasurementUnit] class O6_0 classstyle; O6-- _label -->O6_3("''days''") class O6_3 literal; O5-- unit -->O6 O3-- duration -->O5 O1-- timespan -->O3
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Parts

Describing the hierarchy of parts of resources is a core pattern for having increasingly granular or specific descriptions. The advantage of partitioning is that more specific information can be provided about each part, as a thing separate from the whole. This pattern covers the spectrum of different classes used in the model, from physical and textual, to temporal or geographic. Parts are given using the properties part_of, from the part to the whole.

Use cases for this pattern include:

Note that these parts are separate records from the main entity, and the main entity does not refer to its parts. Instead the API defines a method to retrieve all of the parts of the main entity, or other incoming references.

Example:

The canvas support is part of the overall painting of Spring.

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/spring/support",
  "type": "HumanMadeObject",
  "_label": "Support of Spring",
  "classified_as": [
    {
      "id": "http://vocab.getty.edu/aat/300014844",
      "type": "Type",
      "_label": "Support",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300241583",
          "type": "Type",
          "_label": "Part Type"
        }
      ]
    }
  ],
  "referred_to_by": [
    {
      "type": "LinguisticObject",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300435429",
          "type": "Type",
          "_label": "Material Statement",
          "classified_as": [
            {
              "id": "http://vocab.getty.edu/aat/300418049",
              "type": "Type",
              "_label": "Brief Text"
            }
          ]
        }
      ],
      "content": "Canvas"
    }
  ],
  "part_of": [
    {
      "id": "https://linked.art/example/object/spring",
      "type": "HumanMadeObject",
      "_label": "Jeanne (Spring) by Manet"
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(object/spring/support) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Support of Spring''") class O1_4 literal; O2(aat:300014844) class O2 type; O2-- type -->O2_0[Type] class O2_0 classstyle; O2-- _label -->O2_3("''Support''") class O2_3 literal; O3(aat:300241583) class O3 type; O3-- type -->O3_0[Type] class O3_0 classstyle; O3-- _label -->O3_3("''Part Type''") class O3_3 literal; O2-- classified_as -->O3 O1-- classified_as -->O2 O4( _ ) class O4 infoobj; O4-- type -->O4_0[LinguisticObject] class O4_0 classstyle; O5(aat:300435429) class O5 type; O5-- type -->O5_0[Type] class O5_0 classstyle; O5-- _label -->O5_3("''Material Statement''") class O5_3 literal; O6(aat:300418049) class O6 type; O6-- type -->O6_0[Type] class O6_0 classstyle; O6-- _label -->O6_3("''Brief Text''") class O6_3 literal; O5-- classified_as -->O6 O4-- classified_as -->O5 O4-- content -->O4_3("''Canvas''") class O4_3 literal; O1-- referred_to_by -->O4 O7(object/spring) class O7 object; O7-- type -->O7_0[HumanMadeObject] class O7_0 classstyle; O7-- _label -->O7_3("''Jeanne (Spring) by Manet''") class O7_3 literal; O1-- part_of -->O7
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Membership

Membership in a set is treated slightly differently. A set can have no members and still be a set, whereas if you destroy the last part of an object, it no longer exists. For example, a department of an organization (a Group) might not have any members due to the retirement of the last member, but there is a still an identifiable, ongoing group that would hopefully gain members when new hires are made. Membership is given using the member_of property, instead of the corresponding part_of.

Use cases for the membership pattern include:

Example:

Rembrandt was a member of the Guild of St Luke.

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/person/rembrandt/2",
  "type": "Person",
  "_label": "Rembrandt",
  "member_of": [
    {
      "id": "https://linked.art/example/group/stluke",
      "type": "Group",
      "_label": "Guild of St Luke"
    }
  ]
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(person/rembrandt/2) class O1 actor; O1-- type -->O1_0[Person] class O1_0 classstyle; O1-- _label -->O1_4("''Rembrandt''") class O1_4 literal; O2(group/stluke) class O2 actor; O2-- type -->O2_0[Group] class O2_0 classstyle; O2-- _label -->O2_3("''Guild of St Luke''") class O2_3 literal; O1-- member_of -->O2
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Partitioning of Internal Constructs

It is sometimes necessary to partition an activity that is embedded within another record, such as the Production of an object or Creation of a work, in order to be more specific about individual roles or aspects. In this case, as there isn't another record to refer to with part_of, the parts are included within the record using part. This allows information to be associated with either the individual parts of the activity, or the whole activity.

Example:

A video (modeled as a Work that contains language, or a LinguisticObject) about Rembrandt's Night Watch was directed by Peter Greenaway and Produced by Femke Wolting.

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/text/rembrandtjaccuse/1",
  "type": "LinguisticObject",
  "_label": "Rembrandt's J'accuse",
  "created_by": {
    "type": "Creation",
    "timespan": {
      "type": "TimeSpan",
      "_label": "2008",
      "begin_of_the_begin": "2008-01-01T00:00:00",
      "end_of_the_end": "2008-12-31T23:59:59"
    },
    "part": [
      {
        "type": "Creation",
        "classified_as": [
          {
            "id": "https://vocab.getty.edu/aat/300025654",
            "type": "Type",
            "_label": "Director"
          }
        ],
        "carried_out_by": [
          {
            "id": "https://linked.art/example/person/greenaway",
            "type": "Person",
            "_label": "Peter Greenaway"
          }
        ]
      },
      {
        "type": "Creation",
        "classified_as": [
          {
            "id": "https://vocab.getty.edu/aat/300197742",
            "type": "Type",
            "_label": "Producer"
          }
        ],
        "carried_out_by": [
          {
            "id": "https://linked.art/example/person/wolting",
            "type": "Person",
            "_label": "Femke Wolting"
          }
        ]
      }
    ]
  }
}

graph TD classDef object stroke:black,fill:#E1BA9C,rx:20px,ry:20px; classDef actor stroke:black,fill:#FFBDCA,rx:20px,ry:20px; classDef type stroke:red,fill:#FAB565,rx:20px,ry:20px; classDef name stroke:orange,fill:#FEF3BA,rx:20px,ry:20px; classDef dims stroke:black,fill:#c6c6c6,rx:20px,ry:20px; classDef infoobj stroke:#907010,fill:#fffa40,rx:20px,ry:20px classDef timespan stroke:blue,fill:#ddfffe,rx:20px,ry:20px classDef place stroke:#3a7a3a,fill:#aff090,rx:20px,ry:20px classDef event stroke:#1010FF,fill:#96e0f6,rx:20px,ry:20px classDef literal stroke:black,fill:#f0f0e0; classDef classstyle stroke:black,fill:white; O1(text/rembrandtjaccuse/1) class O1 infoobj; O1-- type -->O1_0[LinguisticObject] class O1_0 classstyle; O1-- _label -->O1_4("''Rembrandt's J'accuse''") class O1_4 literal; O2( _ ) class O2 event; O2-- type -->O2_0[Creation] class O2_0 classstyle; O3( _ ) class O3 timespan; O3-- type -->O3_0[TimeSpan] class O3_0 classstyle; O3-- _label -->O3_2("''2008''") class O3_2 literal; O3-- begin_of_the_begin -->O3_3("''2008-01-01T00:00:00''") class O3_3 literal; O3-- end_of_the_end -->O3_4("''2008-12-31T23:59:59''") class O3_4 literal; O2-- timespan -->O3 O4( _ ) class O4 event; O4-- type -->O4_0[Creation] class O4_0 classstyle; O5(https://vocab.getty.edu/aat/300025654) class O5 type; O5-- type -->O5_0[Type] class O5_0 classstyle; O5-- _label -->O5_3("''Director''") class O5_3 literal; O4-- classified_as -->O5 O6(person/greenaway) class O6 actor; O6-- type -->O6_0[Person] class O6_0 classstyle; O6-- _label -->O6_3("''Peter Greenaway''") class O6_3 literal; O4-- carried_out_by -->O6 O2-- part -->O4 O7( _ ) class O7 event; O7-- type -->O7_0[Creation] class O7_0 classstyle; O8(https://vocab.getty.edu/aat/300197742) class O8 type; O8-- type -->O8_0[Type] class O8_0 classstyle; O8-- _label -->O8_3("''Producer''") class O8_3 literal; O7-- classified_as -->O8 O9(person/wolting) class O9 actor; O9-- type -->O9_0[Person] class O9_0 classstyle; O9-- _label -->O9_3("''Femke Wolting''") class O9_3 literal; O7-- carried_out_by -->O9 O2-- part -->O7 O1-- created_by -->O2
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)