Previously-Held or Context-Specific Assertions

Table of Contents


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.

Assignment of Attributes

The AttributeAssignment class is an Activity, carried out by curators or researchers rather than by artists, 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 also 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.

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 assigned_to property, and the relationship between them is given using classified_as. 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.

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/activity/4", 
  "type": "AttributeAssignment", 
  "classified_as": "identified_by", 
  "timespan": {
    "id": "https://linked.art/example/time/6", 
    "type": "TimeSpan", 
    "begin_of_the_begin": "1804-05-19", 
    "end_of_the_end": "1804-05-19"
  }, 
  "assigned": {
    "id": "https://linked.art/example/name/9", 
    "type": "Name", 
    "value": "Previous Painting Title"
  }, 
  "assigned_to": {
    "id": "https://linked.art/example/object/10", 
    "type": "ManMadeObject", 
    "label": "Current Painting Title", 
    "classified_as": ["aat:300033618","aat:300133025"]
  }, 
  "carried_out_by": [
    {
      "id": "https://linked.art/example/person/14", 
      "type": "Person", 
      "label": "Painting Curator"
    }
  ]
}

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" 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 "workshop of", "studio of", "circle of" and similar attributions in which there is doubt that there really was such a group, and thus there is reluctance to give that hypothetical group an identity. Instead of using the "style of" aat concept, it would use "workshop of" (aat:300404274), or other attribution qualifiers from AAT.

{
  "@context": "https://linked.art/ns/v1/linked-art.json", 
  "id": "https://linked.art/example/activity/5", 
  "type": "AttributeAssignment", 
  "assigned": {
    "id": "https://linked.art/example/activity/6", 
    "type": "Production", 
    "classified_as": ["aat:300404285"], 
    "influenced_by": [
      {
        "id": "https://linked.art/example/person/15", 
        "type": "Person", 
        "label": "Well Known Artist"
      }
    ]
  }, 
  "classified_as": "produced_by", 
  "assigned_to": {
    "id": "https://linked.art/example/object/11", 
    "type": "ManMadeObject", 
    "label": "Example Painting", 
    "classified_as": ["aat:300033618","aat:300133025"]
  }, 
  "carried_out_by": [
    {
      "id": "https://linked.art/example/person/16", 
      "type": "Person", 
      "label": "Painting Curator"
    }
  ]
}

JSON-LD (Raw) | JSON-LD (Playground) | Turtle (Raw) | Turtle (Styled)

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 similar.

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.

{
  "@context": "https://linked.art/ns/v1/linked-art.json", 
  "id": "https://linked.art/example/activity/7", 
  "type": "Activity", 
  "label": "Example Exhibition", 
  "classified_as": ["aat:300054766"], 
  "used_specific_object": [
    {
      "id": "https://linked.art/example/set/6", 
      "type": "Aggregation", 
      "aggregates": ["https://linked.art/example/object/12"]
    }
  ], 
  "part": [
    {
      "id": "https://linked.art/example/activity/8", 
      "type": "AttributeAssignment", 
      "classified_as": "identified_by", 
      "involved": ["https://linked.art/example/set/6"], 
      "assigned": {
        "id": "https://linked.art/example/name/10", 
        "type": "Name", 
        "value": "Exhibition Specific Name"
      }, 
      "assigned_to": {
        "id": "https://linked.art/example/object/12", 
        "type": "ManMadeObject", 
        "label": "Real Painting Name", 
        "classified_as": ["aat:300033618","aat:300133025"]
      }, 
      "carried_out_by": [
        {
          "id": "https://linked.art/example/person/17", 
          "type": "Person", 
          "label": "A. Curator"
        }
      ]
    }
  ]
}

JSON-LD (Raw) | JSON-LD (Playground) | Turtle (Raw) | Turtle (Styled)

Proxies

If there are many AttributeAssignments per object, the actor that carried out the assignment is not important to include in the dataset, and there is a collection or Aggregation of resources that provides context, then there is a more concise form of the above assertions using Proxy resources.

Instead of turning the assignment into an activity, instead we can associate the information directly with a Proxy for the resource that is in the context of the Aggregation. Any number of assertions can be managed by a single Proxy resource, and it is possible to go from the AttributeAssignment pattern to the Proxy pattern and back again without human intervention. There is only one Proxy per combination of an Aggregation and a particular resource that it aggregates.

The equivalent form of the above example would be:

{
  "@context": "https://linked.art/ns/v1/linked-art.json", 
  "id": "https://linked.art/example/activity/9", 
  "type": "Activity", 
  "label": "Example Exhibition", 
  "classified_as": ["aat:300054766"], 
  "used_specific_object": [
    {
      "id": "https://linked.art/example/set/7", 
      "type": "Aggregation", 
      "aggregates": [
        {
          "id": "https://linked.art/example/object/13", 
          "type": "ManMadeObject", 
          "label": "Real Painting Name", 
          "classified_as": ["aat:300033618","aat:300133025"]
        }
      ], 
      "proxies": [
        {
          "id": "https://linked.art/example/Proxy/2", 
          "type": "Proxy", 
          "identified_by": [
            {
              "id": "https://linked.art/example/name/11", 
              "type": "Name", 
              "value": "Exhibition Specific Name"
            }
          ], 
          "proxyIn": "https://linked.art/example/set/7", 
          "proxyFor": "https://linked.art/example/object/13"
        }
      ]
    }
  ]
}

JSON-LD (Raw) | JSON-LD (Playground) | Turtle (Raw) | Turtle (Styled)

The algorithm to go from a set of AttributeAssignments to a set of Proxies is:

proxyFors = {}
for aa in top_activity.part:
  if aa.type == "AttributeAssignment" and aa.involved and aa.involved.type == "Aggregation":
    p = proxyFors.get(aa.assigned_to, None)
    if not p:
      p = Proxy()
      p.proxyFor = aa.assigned_to
      p.proxyIn = aa.involved
      proxyFors[aa.assigned_to] = p
    setattr(p, aa.classified_as, aa.assigned)