Previously-Held or Context-Specific Assertions

Introduction

It is useful for research to have access to historical information, such as which artist was previously believed to be the creator of a work, or previous valuations of an object. The majority of use cases, however, are to get the current information. The assignment of attributes model allows for this additional information to be associated, without making every property a list of historical values.

This pattern is also used for context-specific assertions, such as when an object is given a label or description for the purposes of an exhibition or other event. This exhibition label does not replace the owning museum's title, but is useful for historical comparison and research purposes.

The use of context specific assertions or other attribute assignments should be kept to a minimum if possible. The data structure is significantly more complex than other patterns, which reduces the likelihood of implementation and increases the difficult of search queries. This pattern should only be used if there is no other way to express the knowledge, and it is important to capture with all of the details.

Assignment of Attributes

The AttributeAssignment class is an Activity, carried out by curators or researchers rather than by artists or collectors, that assigns information to resources in the model. This can be used to assign any property or relationship on any resource that can be the subject of such a property. The general Activity properties of carried_out_by, timespan and took_place_at are available for when and where the assignment happened, and who made it. The timespan is the moment when the assignment took place, rather than the length of time that the assignment was held to be true by some audience.

This pattern is useful when you do not want to assert the relationship directly, such as for a name that was previously given to the object but is no longer actively used. Or an attribution of an artist that is possibly true, but might only be an informed guess.

The value of the assignment is given using assigned, and it can be any resource or value. The resource that the value is assigned to is given using the attributed_by property on that resource, and the relationship between them is given using assigned_property. Thus an AttributeAssignment can assign an Actor to a Production with the carried_out_by relationship, or a Name to an Actor with the identified_by relationship. In terms of the relationship that the AttributeAssignment expresses, the resource with the attributed_by property is the subject of the relationship, the relationship itself is given in assigned_property, and the object of the relationship is given in assigned, thereby making up a regular 'triple' of subject, predicate, object.

The example below demonstrates associating a previous title with an object.

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/19",
  "type": "HumanMadeObject",
  "_label": "Current Painting Title",
  "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"
    }
  ],
  "attributed_by": [
    {
      "type": "AttributeAssignment",
      "timespan": {
        "type": "TimeSpan",
        "begin_of_the_begin": "1804-05-19",
        "end_of_the_end": "1804-05-19"
      },
      "carried_out_by": [
        {
          "type": "Person",
          "_label": "Painting Curator"
        }
      ],
      "assigned_property": "identified_by",
      "assigned": [
        {
          "type": "Name",
          "content": "Previous Painting Title"
        }
      ]
    }
  ]
}

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/19) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Current Painting Title''") 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 O5( _ ) class O5 event; O5-- type -->O5_0[AttributeAssignment] class O5_0 classstyle; O6( _ ) class O6 timespan; O6-- type -->O6_0[TimeSpan] class O6_0 classstyle; O6-- begin_of_the_begin -->O6_2("''1804-05-19''") class O6_2 literal; O6-- end_of_the_end -->O6_3("''1804-05-19''") class O6_3 literal; O5-- timespan -->O6 O7( _ ) class O7 actor; O7-- type -->O7_0[Person] class O7_0 classstyle; O7-- _label -->O7_2("''Painting Curator''") class O7_2 literal; O5-- carried_out_by -->O7 O5-- assigned_property -->O5_4("''identified_by''") class O5_4 literal; O8( _ ) class O8 name; O8-- type -->O8_0[Name] class O8_0 classstyle; O8-- content -->O8_2("''Previous Painting Title''") class O8_2 literal; O5-- assigned -->O8 O1-- attributed_by -->O5
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

Assigned Value as Resource

In other situations the assigned value is the appropriate resource with which to associate the AttributeAssignment. In this case we flip the AttributeAssignment around and use assigned_by on the value of the assignment (the object of the relationship), and do not specify the subject of the relationship as it's the resource which refers to the value. For example, it is very useful to be able to assert which organization created and assigned an identifier to an object of a given type in order to disambiguate that organization's identifier from another organization's identifier of the same type, such as accession numbers. Another use case is giving further information about a particular Dimension associated with the object, such as who measured it, when, with which instrument, and so on.

In this case, the subject of the relationship is the resource which refers to the value, the predicate is that relationship, and the object is the resource with the assigned_by property which refers to the AttributeAssignment.

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/object/20",
  "type": "HumanMadeObject",
  "_label": "Example Painting",
  "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"
    }
  ],
  "identified_by": [
    {
      "type": "Identifier",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300312355",
          "type": "Type",
          "_label": "Accession Number"
        }
      ],
      "content": "1925.0034",
      "assigned_by": [
        {
          "type": "AttributeAssignment",
          "carried_out_by": [
            {
              "type": "Group",
              "_label": "First Owning Museum",
              "classified_as": [
                {
                  "id": "http://vocab.getty.edu/aat/300312281",
                  "type": "Type",
                  "_label": "Museum"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "type": "Identifier",
      "classified_as": [
        {
          "id": "http://vocab.getty.edu/aat/300312355",
          "type": "Type",
          "_label": "Accession Number"
        }
      ],
      "content": "B-1254.6",
      "assigned_by": [
        {
          "type": "AttributeAssignment",
          "carried_out_by": [
            {
              "type": "Group",
              "_label": "Another Owning Museum",
              "classified_as": [
                {
                  "id": "http://vocab.getty.edu/aat/300312281",
                  "type": "Type",
                  "_label": "Museum"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

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/20) class O1 object; O1-- type -->O1_0[HumanMadeObject] class O1_0 classstyle; O1-- _label -->O1_4("''Example Painting''") 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 O5( _ ) class O5 name; O5-- type -->O5_0[Identifier] class O5_0 classstyle; O6(aat:300312355) class O6 type; O6-- type -->O6_0[Type] class O6_0 classstyle; O6-- _label -->O6_3("''Accession Number''") class O6_3 literal; O5-- classified_as -->O6 O5-- content -->O5_3("''1925.0034''") class O5_3 literal; O7( _ ) class O7 event; O7-- type -->O7_0[AttributeAssignment] class O7_0 classstyle; O8( _ ) class O8 actor; O8-- type -->O8_0[Group] class O8_0 classstyle; O8-- _label -->O8_2("''First Owning Museum''") class O8_2 literal; O9(aat:300312281) class O9 type; O9-- type -->O9_0[Type] class O9_0 classstyle; O9-- _label -->O9_3("''Museum''") class O9_3 literal; O8-- classified_as -->O9 O7-- carried_out_by -->O8 O5-- assigned_by -->O7 O1-- identified_by -->O5 O10( _ ) class O10 name; O10-- type -->O10_0[Identifier] class O10_0 classstyle; O10-- classified_as -->O6 O10-- content -->O10_3("''B-1254.6''") class O10_3 literal; O11( _ ) class O11 event; O11-- type -->O11_0[AttributeAssignment] class O11_0 classstyle; O12( _ ) class O12 actor; O12-- type -->O12_0[Group] class O12_0 classstyle; O12-- _label -->O12_2("''Another Owning Museum''") class O12_2 literal; O12-- classified_as -->O9 O11-- carried_out_by -->O12 O10-- assigned_by -->O11 O1-- identified_by -->O10
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)

"Style Of" Attribution

There is a common special case of wanting to assign not an individual (e.g. Rembrandt) or a group with specific identity (Workshop of Rembrandt) to the production of an object, but simply to say that it was produced as if it had been produced by some other actor. This is traditionally recorded as being "in the style of" or "in the manner of" a known artist. It is not correct to say that Rembrandt carried out the production, but a search for objects attributed (loosely speaking) to Rembrandt should discover this object. The assessment of "style of" attribution is a judgement decision that might be changed later as new evidence of the actual creator comes to light.

The approach taken for this case is to use an AttributeAssignment that associates a Production activity that is influenced_by the artist and classified_as being in the "style of" (aat:300404285). This prevent systems from mistakenly infering that the actor carried_out the production, but is consistent with the overall pattern.

This would also apply to cases where there is a "circle of" or "follower of" and similar attributions in which there is doubt that there was an actual coherent group, and thus there is reluctance to give that hypothetical group an identity. Instead of using the "style of" AAT concept, it would use another attribution qualifiers.

top = vocab.Painting(ident="auto int-per-segment",art=1)
top._label = "Example Painting"
aa = model.AttributeAssignment()
aa.assigned_property = <abbr  data-ot="crm:P108i_was_produced_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true"><abbr  data-ot="crm:P108i_was_produced_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true"><abbr  data-ot="crm:P108i_was_produced_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true"><abbr  data-ot="crm:P108i_was_produced_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true"><abbr  data-ot="crm:P108i_was_produced_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true">"produced_by"</abbr></abbr></abbr></abbr></abbr>
who = model.Person()
who._label = "Well Known Artist"
prod = model.Production()
prod.influenced_by = who
prod.classified_as = vocab.instances['style of']
aa.assigned = prod
top.attributed_by = aa
by = model.Person()
by._label = "Painting Curator"
aa.carried_out_by = by

Context Specific Assertions

The basic pattern for making an assertion within some context is to reuse the AttributeAssignment activity, and have it be part of some larger activity. A good example of this is the assignment of a particular title to a work during an Exhibition. This could equally be part of the larger cataloging activity of an organization, an art dealer taking inventory, or any number of other contexts.

There are two relationships to note with this pattern. The first is that the broader activity has a part which is the AttributeAssignment. This gives some basic temporal context for the assignment. There is also in many cases a set of objects or other resources that provide additional context. In the Exhibition case, the set of objects and their labels in the exhibit is involved in the provision of the Name of the individual object.

top = vocab.Exhibition(ident="auto int-per-segment")
top._label = "Example Exhibition"
agg = model.Set()
top.used_specific_object = agg
obj = vocab.Painting(art=1)
obj._label = "Real Painting Name"
agg.member = obj
aa = model.AttributeAssignment()
aa.assigned_property = <abbr  data-ot="crm:P1_is_identified_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true"><abbr  data-ot="crm:P1_is_identified_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true"><abbr  data-ot="crm:P1_is_identified_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true"><abbr  data-ot="crm:P1_is_identified_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true"><abbr  data-ot="crm:P1_is_identified_by" data-ot-title="Core Linked Data Term" data-ot-fixed="true">"identified_by"</abbr></abbr></abbr></abbr></abbr>
name = model.Name()
name.content = "Exhibition Specific Name"
aa.assigned = name
obj.attributed_by = aa
curator = model.Person()
curator._label = "A. Curator"
aa.carried_out_by = curator
aa.involved = agg
aa.part_of = top

Inferred Data

Some assertions, or even entire resources, are computationally inferred from other data rather than being evidenced in primary source literature or history. It is useful to tag these resources as such, so that they can be treated appropriately when it comes to research making use of them: if the underlying data has errors, these errors will have been propogated to this resource.

The way that this can be signalled in the data is to add the "computer-generated" concept aat:300202389 to the resource in the classified_as field.

{
  "@context": "https://linked.art/ns/v1/linked-art.json",
  "id": "https://linked.art/example/event/2",
  "type": "Activity",
  "_label": "Inferred Activity",
  "classified_as": [
    {
      "id": "http://vocab.getty.edu/aat/300202389",
      "type": "Type",
      "_label": "Computer Generated"
    }
  ],
  "carried_out_by": [
    {
      "type": "Actor",
      "_label": "Performer of inferred activity"
    }
  ]
}

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/2) class O1 event; O1-- type -->O1_0[Activity] class O1_0 classstyle; O1-- _label -->O1_4("''Inferred Activity''") class O1_4 literal; O2(aat:300202389) class O2 type; O2-- type -->O2_0[Type] class O2_0 classstyle; O2-- _label -->O2_3("''Computer Generated''") class O2_3 literal; O1-- classified_as -->O2 O3( _ ) class O3 actor; O3-- type -->O3_0[Actor] class O3_0 classstyle; O3-- _label -->O3_2("''Performer of inferred activity''") class O3_2 literal; O1-- carried_out_by -->O3
Other Representations: JSON-LD (raw) | JSON-LD (playground) | Turtle (raw) | Turtle (styled)