Activity Streams/Expanded Vocabulary

From W3C Wiki

Background

This is the beginning of an expanded AS2 vocabulary that integrates many "core" use cases that are typical in many social applications as evidenced by known implementations. The vocabulary model is an amalgam from several sources, reorganized around the current existing AS2 vocabulary model, and refactored a bit so that things make more sense. The selection criteria is simple: based on a survey of existing social applications, if a particular case is evidenced by at least three existing implementations, it is included here.

It is important to note that this Extended Vocabulary does overlap with other existing vocabularies... namely schema.org's Action hierarchy. This overlap is acknowledged and is intentional. The philosophy here is that an Activity Streams 2.0 implementation ought to be able to cover the most common core use cases without requiring the use of any specific "External" Vocabulary. Implementations that choose to use schema.org as an alternative can do so with little difficulty, and it is possible to employ linked data mechanisms to link the models together where they happen to overlap.

There is an OWL Vocabulary defined here

There are a number of changes to the basic model included in this expanded view. For one, the "author" property is deprecated, a new "attributedTo" property is defined, and "actor" is defined as a "subPropertyOf" the new "attributedTo". This provides us with a more generalized model. Not all objects have an "author" but nearly all objects can be "attributed to" some particular entity.

Use Cases

  • Creation, Modification and Organization of Content
  • Social Gestures such as Like, Follow, Share, Save, Comment, Review, etc
  • Mentions and Tags
  • Geo-location (arriving, leaving)
  • Events (RSVP)
  • Offers
  • Friend Requests, managing social networks
  • Use of Content
  • Questions
  • Blocking / Muting / Flagging Inappropriate Content
  • Linking Identities
  • Achievements
  • Potential Actions attached to objects
  • Rollup / Grouping

The classes and properties defined in the vocabulary have been selected to allow implementers a minimal ability to communicate key information about social activity without requiring direct use of other external vocabularies. While use of external vocabularies is allowed, they should not be required in order for two social systems to exchange basic activity information. The examples below will illustrate how this expanded vocabulary achieves this goal for each of the use cases above.

Creation, Modification and Organization of Content

Most social systems tend to deal with content creation, modification and organization.

Sally created a new blog post

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Create",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Article",
     "@id": "http://www.example.org/posts/1",
     "displayName": "A New Blog Post",
     "url": "http://www.example.org/posts/1",
     "attributedTo": "acct:sally@example.org"
  }
}

Sally updated a new blog post

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Update",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Article",
     "@id": "http://www.example.org/posts/1",
     "displayName": "A New Blog Post",
     "url": "http://www.example.org/posts/1",
     "attributedTo": "acct:sally@example.org"
  }
}

Joe deleted a blog post

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Delete",
  "actor": "acct:joe@example.org",
  "object": {
     "@type": "Article",
     "@id": "http://www.example.org/posts/1",
     "displayName": "A New Blog Post",
     "url": "http://www.example.org/posts/1",
     "attributedTo": "acct:sally@example.org"
  }
}

Sally uploaded a photo

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Post",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Image",
     "@id": "http://www.example.org/img/cat.png",
     "displayName": "My Cat",
     "url": "http://www.example.org/img/cat.png",
     "attributedTo": "acct:john@example.org"
  }
}

Sally added a photo to an album

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Add",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Image",
     "@id": "http://www.example.org/img/cat.png",
     "displayName": "My Cat",
     "url": "http://www.example.org/img/cat.png"
  },
  "target": {
    "@type": "Album",
    "@id": "http://www.example.org/albums/cats",
    "displayName": "Cats"
  }
}

Sally removed a photo from an album

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Remove",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Image",
     "@id": "http://www.example.org/img/cat.png",
     "displayName": "My Cat",
     "url": "http://www.example.org/img/cat.png"
  },
  "origin": {
    "@type": "Album",
    "@id": "http://www.example.org/albums/cats",
    "displayName": "Cats"
  }
}

The vocabulary defines the Activity subtypes Add, Create, Delete, Post, Remove, Move, and Update for content management use cases. Of course, Add and Remove can be used for other use cases also. The object classes Content, Article, Collection, Album, Folder, Story, Document, Image, Video, Audio, Note and Page are used to describe various kinds of common social content.

Collections in the extended vocabulary can be ordered or unordered. There are two Collection types, "as:Collection" and "as:OrderedCollection", along with "items" and "orderedItems" properties. The "items" property is defined in the JSON-LD @context as "@container": "@set", which means it is unordered. The "orderedItems" property is defined as "@container": "@list", which means it is ordered. Both map to the "as:items" property in the vocabulary. For an "OrderedCollection", you MUST use "orderedItems". For "Collection" you can use either but you can't use both.

An ordinary unordered Collection

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Collection",
  "items": [
     { "@type": "Note", "content": "My Note" },
     { "@type": "Note", "content": "My Other Note" }
  ]
}

An ordered Collection, using @type="Collection"

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Collection",
  "orderedItems": [
     { "@type": "Note", "content": "My Note" },
     { "@type": "Note", "content": "My Other Note" }
  ]
}

An ordered Collection, using @type="OrderedCollection"

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "OrderedCollection",
  "orderedItems": [
     { "@type": "Note", "content": "My Note" },
     { "@type": "Note", "content": "My Other Note" }
  ]
}

For implementations that do not take an RDF view of the world, the only thing you really need to know is that "items" is considered unordered while "orderedItems" is always ordered.

The as:Album and as:Folder object types extend from as:Collection and can be ordered or unordered.

The as:Story object type, on the other hand, extends from as:OrderedCollection and MUST be ordered. A "Story" is used in the same sense as a Google+ Auto-Awesome Story, or Facebook photo stories, etc. It's essentially an ordered collection of content intended to tell a story of some kind. For instance...

A Photo-Story of My Vacation

{
  "@content": "http://www.w3.org/ns/activitystreams",
  "@type": "Story",
  "displayName": "A Photo-Story of My Vacation",
  "orderedItems": [
    {"@type": "Note", "displayName": "Day 1: San Francisco" },
    {"@type": "Image", "displayName": "Landing at the Airport", "url": "http://example.org/p1.jpeg" },
    {"@type": "Note", "displayName": "Day 2: Jail time!" },
    {"@type": "Image", "displayName": "Getting Bailed out of Jail", "url": "http://example.org/p2.jpeg" }
  ]
}

An actor might move an object from one location to another:

Sally moved 'cat.jpg' from Folder 'A' to Folder 'B'

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Move",
  "actor": "acct:sally@example.org",
  "object": "http://example.org/cat.jpg",
  "target": {
    "@type": "Folder",
    "displayName": "Folder B"
  },
  "origin": {
    "@type": "Folder",
    "displayName": "Folder A"
  }
}

Social Gestures such as Respond, Like, Follow, Share, Save, Comment, Review, etc

Evidenced by pretty much all social platforms...

Social Gestures such as Like, Follow are also defined.

Sally Liked a Photo

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Like",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Image",
     "@id": "http://www.example.org/img/cat.png",
     "displayName": "My Cat",
     "url": "http://www.example.org/img/cat.png"
  }
}

Sally is following John

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Follow",
  "actor": "acct:sally@example.org",
  "object": "acct:john@example.org"
}

Sally shared a photo with John

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Share",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Image",
     "@id": "http://www.example.org/img/cat.png",
     "displayName": "My Cat",
     "url": "http://www.example.org/img/cat.png"
  },
  "target": "acct:john@example.org"
}

Sally saved a photo

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Save",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Image",
     "@id": "http://www.example.org/img/cat.png",
     "displayName": "My Cat",
     "url": "http://www.example.org/img/cat.png"
  }
}

Sally commented on a photo (actually: "Sally posted a note in response to a photo")

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Post",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Note",
    "content": "Great photo!",
    "author": "acct:sally@example.org",
    "inReplyTo": {
     "@type": "Image",
     "@id": "http://www.example.org/img/cat.png",
     "displayName": "My Cat",
     "url": "http://www.example.org/img/cat.png"
    }
  }
}

Sally reviewed a photo

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Review",
  "rating": 3.5,
  "content": "This is a great photo",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Image",
     "@id": "http://www.example.org/img/cat.png",
     "displayName": "My Cat",
     "url": "http://www.example.org/img/cat.png"
  }
}

The Activity subtypes Respond, Favorite, Like, Dislike, Follow, Review, Save and Share are provided for Social Gesture use cases.

Mentions and Tags

Evidenced by pretty much all social platforms...

Mentions and Tags are extremely common special forms of social gestures. These ought to be supported by the vocabulary directly:

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Note", 
  "content": "<div vocab="http://www.w3.org/ns/activitystreams">This note mentions <span typeof=\"Mention\">
<a property=\"href\" href=\"http://example.org/joe\">@<span property="displayName">Joe</span></a></span> 
<span typeof=\"Tag\"><a property=\"href\" href=\"http://example.org/tags/example\">
#<span property="displayName">example</span></a></span></div>",
  "tag": [
    {
      "@type": "Mention",
      "href": "http://example.org/joe",
      "displayName": "Joe"
    },
    {
      "@type": "Tag",
      "href": "http://example.org/tags/example",
      "displayName": "example"
    }
  ]
}

Representing the mentions and tags as objects in the JSON-LD would be optional depending on the needs of the implementation. The example above is similar to what Twitter does when it extracts referenced entities from a tweet. Many implementations may not actually need to extract those out in this way. Either way, we'd have a consistent model that works in markup and json-ld.

Modeling Mention and Tag as extensions to Link gives us a structured way of representing federated at-mentions and hashtags. This approach is easily compatible with webmentions

Geo-location (traveling, arriving, leaving)

Evidenced by: Facebook, Twitter, G+, Foursquare, etc

Many social systems deal with geolocation functions. Primarily checking in to a location or checking out.

Sally is traveling to work from home

  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Travel",
  "actor": "acct:sally@example.org",
  "target": {
    "@type": "Place",
    "displayName": "Work"
  },
  "origin": {
    "@type": "Place",
    "displayName": "Home"
  }
}

"Travel" is a naturally intransitive verb. The actor is the direct object. The "target" specifies where the "actor" is going.

Sally arrived at work

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Arrive",
  "actor": "acct:sally@example.org",
  "location": {
     "@type": "Place",
     "displayName": "Work",
     "longitude": 12.3,
     "latitude": 45.6,
     "radius": 0.5,
     "units": "miles"
  }
}

"Arrive" is a naturally intransitive verb. The actor is the direct object. The "location" specifies where the "actor" arrived.

Sally left work

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Leave",
  "actor": "acct:sally@example.org",
  "object": {
     "@type": "Place",
     "displayName": "Work"
  }
}

The Place object and Activity subtypes Arrive and Leave are provided primarily for Geolocation use cases. The "target" roughly equates to the english preposition "to". The "origin" roughly equates to the english preposition "from". The "location" roughly equates to the english preposition "at location".

Events (RSVP)

Evidenced by: Facebook, Twitter, G+, Foursquare, etc

Many social systems deal with invitations to events, along with responses

Sally invited John to a Party (more specifically: Sally offered a party invitation to John)

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Invite",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Event",
    "displayName": "A Party!",
    "startTime": "2014-12-12T12:34:56Z"
  },
  "target": "acct:john@example.org"
}

John accepted an invitation

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Accept",
  "actor": "acct:john@example.org",
  "object": {
    "@type": "Invite",
    "actor": "acct:sally@example.org",
    "object": {
      "@type": "Event",
      "displayName": "A Party!",
      "startTime": "2014-12-12T12:34:56Z"
    },
    "target": "acct:john@example.org"
  }
}

John rejected an invitation

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Reject",
  "actor": "acct:john@example.org",
  "object": {
    "@type": "Invite",
    "actor": "acct:sally@example.org",
    "object": {
      "@type": "Event",
      "displayName": "A Party!",
      "startTime": "2014-12-12T12:34:56Z"
    },
    "target": "acct:john@example.org"
  }
}

John tentatively accepted an invitation

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "TentativeAccept",
  "actor": "acct:john@example.org",
  "object": {
    "@type": "Invite",
    "actor": "acct:sally@example.org",
    "object": {
      "@type": "Event",
      "displayName": "A Party!",
      "startTime": "2014-12-12T12:34:56Z"
    },
    "target": "acct:john@example.org"
  }
}

John tentatively rejected an invitation

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "TentativeReject",
  "actor": "acct:john@example.org",
  "object": {
    "@type": "Invite",
    "actor": "acct:sally@example.org",
    "object": {
      "@type": "Event",
      "displayName": "A Party!",
      "startTime": "2014-12-12T12:34:56Z"
    },
    "target": "acct:john@example.org"
  }
}

John explicitly ignored an invitation

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Ignore",
  "actor": "acct:john@example.org",
  "object": {
    "@type": "Invite",
    "actor": "acct:sally@example.org",
    "object": {
      "@type": "Event",
      "displayName": "A Party!",
      "startTime": "2014-12-12T12:34:56Z"
    },
    "target": "acct:john@example.org"
  }
}

The Event object and the Activity subtypes Accept, TentativeAccept, Ignore, Invite, Reject, and TentativeReject are provided primarily for event use cases.

The as:Question can be used to represent a counter to an Invite...

Sally is asking 'Can we do this time instead?' in response to an invitation

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Question",
  "actor": "acct:sally@example.org",
  "content": "Can we do this time instead?"
  "option": {
    "@type": "Event",
    "displayName": "A Party",
    "startTime": "2015-01-01T12:34:56Z",
    "endTime": "2015-01-02T12:34:56Z"
  },
  "inReplyTo": {
    "@type": "Invite",
    "@id": "urn:examples:invite:123"
  }
}

Question is a strange kind of object. It can be represented both as Content and as a form of Activity. Essentially, "Sally is asking John a question". When used as an Activity, "Question" expands idiomatically to "is asking a question". While "asking a question" is not actually intransitive, the question itself is the object of the activity. Rather than defining an "Ask" verb with a "Question" object, I collapse those down into a single Question which is both Content and IntransitiveActivity. This gives a more compact expression.

Many systems that deal with events also handle Reservations, Assignment/Delegation and Confirmation...

Sally created a reservation for an event in conference room A

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Reservation",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Event",
    "startTime": "2015-12-12T12:34:56Z",
    "endTime": "2015-12-12T13:34:56Z",
    "location": {
      "@type": "Place",
      "displayName": "Conference Room A"
    }
  }
}

Here, "Reservation" is a unique type of thing that is both an Activity and an Object (much like Question). The type "Reservation" is equivalent to "Created a Reservation". The "Create" verb could be used with a "Reservation" object but doing so makes things unnecessarily verbose.

Cancel a reservation

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Delete",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Reservation",
    "actor": "acct:sally@example.org",
    "object": {
      "@type": "Event",
      "startTime": "2015-12-12T12:34:56Z",
      "endTime": "2015-12-12T13:34:56Z",
      "location": {
        "@type": "Place",
        "displayName": "Conference Room A"
      }
    }
  }
}

Confirm a reservation Cancel a reservation

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Confirm",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Reservation",
    "actor": "acct:sally@example.org",
    "object": {
      "@type": "Event",
      "startTime": "2015-12-12T12:34:56Z",
      "endTime": "2015-12-12T13:34:56Z",
      "location": {
        "@type": "Place",
        "displayName": "Conference Room A"
      }
    }
  }
}


Sally assigns Role 'Moderator' to John

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Assign",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Role",
    "displayName": "Moderator"
  },
  "target": "acct:joe@example.org"
}

Offers

Evidenced by: Twitter, Facebook, Foursquare/Swarm, etc

Sally offered John "Some Advice"

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Offer",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Note",
    "displayName": "Some Advice",
    "content": "Never bet on the losing horse"
  },
  "target": "acct:john@example.org"
}

(obviously Offers can be far more useful when dealing with products, discounts, etc... It's worth noting that the Invite, ConnectionRequest, FriendRequest and Give Activity subtypes are also Offer subtypes). The semantics of offer are "Actor offered Object to Target".

A Give is a kind of offer:

Sally gave John "Some Advice"

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Give",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Note",
    "displayName": "Some Advice",
    "content": "Never bet on the losing horse"
  },
  "target": "acct:john@example.org"
}

Friend Requests, managing social networks

Evidenced by pretty much every social platform...

Sally sent John a friend request

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "FriendRequest",
  "actor": "acct:sally@example.org",
  "object": "acct:john@example.org"
}

John Accepted Sally's Friend Request

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Accept",
  "actor": "acct:john@example.org",
  "object": {
    "@type": "FriendRequest",
    "actor": "acct:sally@example.org",
    "object": "acct:john@example.org"
  }
}

John rejected Sally's Friend Request

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Reject",
  "actor": "acct:john@example.org",
  "object": {
    "@type": "FriendRequest",
    "actor": "acct:sally@example.org",
    "object": "acct:john@example.org"
  }
}

Sally revoked her friend request

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Undo",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "FriendRequest",
    "actor": "acct:sally@example.org",
    "object": "acct:john@example.org"
  }
}

John added Sally to his collection of friends

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Add",
  "actor": "acct:john@example.org",
  "object": "acct:sally@example.org",
  "target": {
    "@type": "Collection",
    "@id": "http://example.org/john/friends",
    "displayName": "John's Friends"
  }
}

Use of Content

Use functionality evidenced by: Facebook, G+, pump.io, etc

Many social platforms allow users to express the types of content they are consuming. For instance, watching a video, reading a book, or listening to music. The Experience, View, Watch, Read, and Listen activity types are provided for those purposes.

Sally Watched A Movie

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Watch",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Video",
    "displayName": "A Movie"
  }
}

Sally Read An Article

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Read",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Article",
    "displayName": "An Article"
  }
}

Sally Listened To Music

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Listen",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Audio",
    "displayName": "Music"
  }
}

Sally Viewed An Image

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "View",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Image",
    "displayName": "An Image"
  }
}

Questions

Questions functionality evidenced by: Facebook, G+, Stackexchange, Quora, etc

Many Social systems deal with Question/Answer scenarios. The Q&A scenario becomes a bit more complex because there is a natural workflow aspect. Questions may or may not have possible answers, there ought to be some clear way of indicating how to select, form and submit a particular answer, it ought to be possible to reject or accept specific answers.

Asking a question

Questions may have a set of possible answers or not. There might be a single answer option or multiple. To indicate single answer, use "oneOf", to indicate multiple answers, use "anyOf"...

In this example, the members of "oneOf/anyOf" are instances of as:PossibleAnswer. These are essentially "answer templates". They describe the shape of a possible answer. Answer's themselves are any as:Note that conforms to the specified shape that contains an inReplyTo pointing to the as:Question. When an as:Object is used as the value of "shape", it means that the given as:Object is an example, or template of the answer.

Note: it's possible to use other as:Object instances as values in "oneOf/anyOf". This gets a bit murky. Using as:PossibleAnswer is preferred because the semantics are clear.

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Question",
  "@id": "urn:example:question:a",
  "actor": "acct:sally@example.org",
  "displayName": "What is your choice?",
  "oneOf": [
    {
      "@type": "PossibleAnswer", 
      "displayName": "Option A",
      "shape": {
        "@type": "Note",
        "displayName": "Option A"
      }
    },
    {
      "@type": "PossibleAnswer", 
      "displayName": "Option B",
      "shape": {
        "@type": "Note",
        "displayName": "Option B"
      }
    }
  ],
  "action": {
    "@type": "Respond",
    "using": {
      "@type": "HttpRequest",
      "href": "http://api.example.org/answer?id=123",
      "hasExpectedInput": {
        "@type": "Payload",
        "mediaType": "application/activity+json",
        "shape": "Note"
      }
    }
  }
}

Answering a question: Actor posted Object as an answer to Target

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Respond",
  "actor": "acct:john@example.org",
  "object": {
    "@type": "Note",
    "displayName": "Option B",
    "inReplyTo": "urn:example:question:a",
    "content": "I chose option B because it's the best answer"
  },
  "target": "urn:example:question:a"
}

Many Q&A systems will provide the option of voting on answers already given to a question. That can be done using potential actions...

{
  "@type": "Question",
  "displayName": "What is your choice?",
  "replies": {
    "@type": "Collection",
    "items": [
      {
        "@type": "Note",
        "displayName": "Option B",
        "action": [
          {
            "@type": "Like",
            "displayName": "+1",
            "using": {
              "@type": "HttpRequest",
              "href": "http://api.example.org/like?id=123"
            }
          },
          {
            "@type": "Dislike",
            "displayName": "-1",
            "using": {
              "@type": "HttpRequest",
              "href": "http://api.example.org/dislike?id=123"
            }
          }
        ]
      }
    ]
  } ,
  "oneOf": [
    {
      "@type": "PossibleAnswer", 
      "displayName": "Option A",
      "shape": {
        "@type": "Note",
        "displayName": "Option A"
      }
    },
    {
      "@type": "PossibleAnswer", 
      "displayName": "Option B",
      "shape": {
        "@type": "Note",
        "displayName": "Option B"
      }
    }
  ],
  "action": {
    "@type": "Respond",
    "using": {
      "@type": "HttpRequest",
      "href": "http://api.example.org/answer?id=123",
      "hasExpectedInput": {
        "@type": "Payload",
        "mediaType": "application/activity+json",
        "shape": "Note"
      }
    }
  }
}

Answers might take other forms. For instance, the answer might involve posting an HTML form with a simple number value.. for instance, in the following example, Option's A and B have the shape of xsd:string values "A" and "B". The Question has an "Answer" action implemented using an HTTP Request whose expected input is an HTML Form with a single "answer" parameter that is expected to be an xsd:string. If "Option A" is selected, the value of the HTML Form's "answer" parameter would be "A".

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Question",
  "@id": "urn:example:question:a",
  "actor": "acct:sally@example.org",
  "displayName": "What is your choice?",
  "oneOf": [
    {
      "@type": "PossibleAnswer", 
      "displayName": "Option A",
      "shape": {
        "@type": "xsd:string",
        "@value": "A"
      }
    },
    {
      "@type": "PossibleAnswer", 
      "displayName": "Option B",
      "shape": {
        "@type": "xsd:string",
        "@value": "B"
      }
    }
  ],
  "action": {
    "@type": "Respond",
    "using": {
      "@type": "HttpRequest",
      "href": "http://api.example.org/answer?id=123",
      "hasExpectedInput": {
        "@type": "Payload",
        "mediaType": "application/x-www-form-urlencoded",
        "shape": {
          "@type": "HtmlForm",
          "parameter": {
             "name": "answer",
             "shape": "xsd:string"
          }
        }
      }
    }
  }
}

Blocking / Muting / Flagging Inappropriate Content

Moderation functionality evidenced by: Facebook, Twitter, IBM Connections, SugarCRM, G+, etc

Many social platforms support the ability to block users, mute or ignore objects/people and report inappropriate content or abuse. There are no common standards, however, for performing these actions.

Sally is blocking Joe

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Block",
  "actor": "acct:sally@example.org",
  "object": "acct:joe@example.org"
}

Sally is muting Joe (more specifically, Sally is ignoring Joe)

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Ignore",
  "actor": "acct:sally@example.org",
  "object": "acct:joe@example.org"
}

Sally flagged the note

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Flag",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Note",
    "content": "An inappropriate note"
  }
}

The Flag activity is generalized here without specifying detail about *why* the content was flagged. Subclasses of the Flag activity can be used to provide more detail... e.g.

:FlagAsAbusive a as:Activity ;
  rdfs:subClassOf as:Flag .

Linking Identities

Many existing social systems allow Actors to be associated with multiple Identities. For instance, a user might connect their Facebook and Twitter profiles to their main profile. There is currently no standardized way of representing such connections.

One of the key issues associated with attached identities in this way is providing proof that the assertion is valid. This, perhaps, can be addressed using JSON Web Tokens, but there are other approaches that can be used as well....

{
  "@type": "Claim",
  "actor": "acct:joe@example.org",
  "object": {
    "@type": "Identity",
    "displayName": "Joe"
  },
  "proof": {
    "@type": "urn:ietf:params:oauth:token-type:jwt",
    "@value": "{jwt-content}"
  }
}

The above shows one possible way this can be done. Essentially, "acct:joe@example.org claimed Identity "Joe" using a JWT as proof".

This would require the creation a few new artifacts:

  1. Claim -- an Activity meaning "to claim ownership of"
  2. Identity -- a subclass of Actor. Perhaps Person becomes a subclass of Identity?
  3. proof -- a property with range xsd:anyType. Can be object or literal value. In the domain of "Claim" only. Provides the proof of the claim.

Another approach is to have an actor assign an identity to a target...

{
  "@type": "Assign",
  "actor": "acct:sally@example.net",
  "object": {
    "@type": "Identity",
    "@id": "acct:joe@example.org"
  },
  "target": "acct:joe@example.net"
}

Assignments wouldn't need proofs.

Achievements

Achievements functionality evidenced by: Facebook, Swarm, Stackexchange, etc

Many social systems deal with "Achievements". For instance, Facebook has the notion of Game Achievements, Foursquare/Swarm has the notion of earned stickers / mayorships, etc. Other systems have the notion of Badges that can be earned or given.

Sally gave a badge to Joe

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Give",
  "actor": "acct:sally@example.org",
  "object": {
    "@type": "Object",
    "displayName": "A Badge!"
  },
  "target": "acct:joe@example.org"
}

Joe earned A Badge

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Achieve",
  "actor": "acct:joe@example.org",
  "object": {
    "@type": "Object",
    "displayName": "A Badge!"
  }
}

Joe achieved a goal

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Achieve",
  "actor": "acct:joe@example.org",
  "object": {
    "@type": "Object",
    "displayName": "A goal"
  }
}

It's not clear yet, however, if this is something that's common enough to warrant adding to the Extended Vocabulary...

Potential Actions attached to objects

Potential actions functionality evidence by existing implementations: OpenSocial, Facebook, Twitter, G+, IBM Connections, etc. (these are not implementations of the specific approach documented here, but of the capability in general. What is documented here is an attempt at normalizing the existing incompatible approaches)

A simple event with a handful of potential actions without details of how to carry them out (an implementation would be expected to fill in the details)

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Event",
  "displayName": "A Party", 
  "objectOf": [
    "Accept", 
    "TentativeAccept", 
    "Reject", 
    "TentativeReject", 
    "Ignore"
  ]
}

An event with a handful of potential actions with details of how to carry them out

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Event",
  "displayName": "A Party", 
  "objectOf": [
    {
      "@type": "Accept",
      "displayName": "Accept this invite",
      "image": "http://example.org/img/accept.png",
      "using": {
        "@type": "HttpRequest",
        "href": "http://api.example.org/accept?id=123abc",
        "method": "POST"
      }
    },
    {
      "@type": "TentativeAccept",
      "displayName": "Tentatively Accept this invite",
      "image": "http://example.org/img/acceptmaybe.png",
      "using": {
        "@type": "HttpRequest",
        "href": "http://api.example.org/accept?id=123abc&tentative",
        "method": "POST"
      }
    },
    {
      "@type": "Reject",
      "displayName": "Reject this invite",
      "image": "http://example.org/img/reject.png",
      "using": {
        "@type": "HttpRequest",
        "href": "http://api.example.org/reject?id=123abc",
        "method": "POST"
      }
    },
    {
      "@type": "TentativeReject",
      "displayName": "Tentatively Reject this invite",
      "image": "http://example.org/img/rejectmaybe.png",
      "using": {
        "@type": "HttpRequest",
        "href": "http://api.example.org/reject?id=123abc&tentative",
        "method": "POST"
      }
    },
    {
      "@type": "Ignore",
      "displayName": "Ignore this invite",
      "image": "http://example.org/img/ignore.png",
      "using": {
        "@type": "HttpRequest",
        "href": "http://api.example.org/ignore?id=123abc",
        "method": "POST"
      }
    }
  ]
}

The ActivityHandler, BrowserView, EmbeddedView, HttpRequest, HtmlForm, HttpHeader, Parameter, Payload and UrlTemplate object classes are provided to handle potential action use cases.

Potential Actions can be described in one of four ways: either as just an identifier (leaving the implementation to figure things out) or as a BrowserView, HttpRequest or EmbeddedView.

An HTTP Request with url-encoded HTML Form Input

{
  "@type": "Accept",
  "displayName": "Accept",
  "using": {
    "@type": "HttpRequest",   
    "href": "http://api.example.org/accept",
    "method": "POST",
    "hasExpectedInput": [
      {
        "@type": "Payload",
        "mediaType": "application/x-www-form-urlencoded",
        "shape": {
          "@type": "HtmlForm",
          "parameter": [
            {
              "@type": "Parameter",
              "name": "id",
              "shape": "xsd:string"
            }
          ]
        }
      }
    ]
  }
}

A Browser View

{
  "@type": "Accept",
  "displayName": "Accept",
  "using": {
    "@type": "BrowserView",   
    "href": "http://www.example.org/accept?id=123abc",
    "browserContext": "_new"
  }
}

An embedded HTML Form

{
  "@type": "Accept",
  "displayName": "Accept",
  "using": {
    "@type": "EmbeddedView",   
    "mediaType": "text/html",
    "content": "<form>...</form>
  }
}

Rollup / Grouping

Rollup functionality evidenced by: IBM Connections, Facebook, Yammer, SugarCRM, Twitter, and many other social platform implementations

Many social systems support the notion of grouping contextually related Activities in order to reduce clutter and verbosity in a stream. We see this, for instance, whenever we see things like "John and 4 other people like ..." etc. Most often, these kinds of roll ups can be performed automatically based on activities sharing the same object, target, actor, location, etc. There are times, however, when contextually related activities need to be explicitly identified. Some Activity Streams implementations (e.g. IBM Connections, xAPI, etc) support the ability to explicitly specify a context for an Activity/Object. Objects that share the same context can be rolled up / grouped together.

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Collection",
  "items": [
    {
      "@type": "Share",
      "actor": "acct:sally@example.org",
      "object": "http://example.org/posts/1",
      "target": "acct:john@example.org",
      "context": "http://example.org/contexts/1"
    },
    {
      "@type": "Like",
      "actor": "acct:joe@example.org",
      "object": "http://example.org/posts/2",
      "context": "http://example.org/contexts/1"
    }
  ]
}

Types of Actors

The vocabulary defines a set of common actor types.

  • Application
  • Device
  • Group
  • Organization
  • Community
  • Identity
  • Person
  • Process
  • Role
  • Service
  • Identity

These reflect the many diverse types of entities that can cause an activity to occur. The vocabulary does not define object specific properties for these. Instead, they are described in the most general sense possible.

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Application",
  "displayName": "An Application"
}
{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Device",
  "displayName": "A Device"
}
{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Group",
  "displayName": "A Group"
}
{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Organization",
  "displayName": "An Organization"
}
{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Community",
  "displayName": "A Community"
}
{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Identity",
  "displayName": "An Identity"
}
{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Person",
  "displayName": "Sally Jones"
}
{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Process",
  "displayName": "A Process"
}
{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Role",
  "displayName": "The Moderator"
}
{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Service",
  "displayName": "A Service"
}

If an implementer wishes, the actor detail can be filled in using external vocabularies such as VCard, Org, FOAF or Prov ontologies.

The Identity type is unique in that it does not necessarily reflect a specific kind of object. A Person can have multiple Identities. A service might wish to say something like "Identity 'foo' performed a task" rather than "Person 'foo' ...". One concrete example would be anonymous identities.

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Identity",
  "@id": "http://www.w3.org/ns/activitystreams#Anonymous"
}

Using External Vocabularies

Using external vocabularies is simple...

For instance, using http://w3c.github.io/web-annotation/model_fpwd/static.html ...

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Create", 
  "actor": "acct:sally@example.org",
  "object": {
        "@context": "http://www.w3.org/ns/oa#",
	"@id": "http://example.org/anno1",
	"@type":"oa:Annotation",
	"body": "content",
	"target": "http://example.org/target1"
  }
}

Another secondary piece of work will be to create an equivalence map between the AS2 vocabulary and other vocabularies such as schema.org, the PROV-O ontology, FOAF, VCard, etc. Let's assume, for instance, that as:Person is defined as being equivalent to vcard:Individual. Then we could do things like:

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "Person",
  "vcard:fn": "John Smith",
  "vcard:hasEmail": "mailto:john@example.org"
}

Or, if we assume that schema.org's Action is defined as being equivalent to as:Activity, then we could do:

{
  "@context": "http://www.w3.org/ns/activitystreams",
  "@type": "http://schema.org/ShareAction",
  "actor": "acct:sally@example.org"
}

The details for these mappings need to be worked out, and they can become rather complicated. VCard and FOAF will be the easiest to map in the near term. Non-RDF implementations will have a much easier go at it.

The OWL Definition

@prefix : <http://www.w3.org/ns/activitystreams#> .
@prefix as: <http://www.w3.org/ns/activitystreams#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@base <http://www.w3.org/ns/activitystreams> .

<http://www.w3.org/ns/activitystreams#> a owl:Ontology ;
  rdfs:comment "Extended Activity Streams 2.0 Vocabulary"@en ;
  rdfs:label "Activity Streams 2.0"@en ;
  owl:imports <http://www.w3.org/ns/prov#> .

#################################################################
#
#    Datatypes
#
#################################################################

rdf:langString a rdfs:Datatype .
xsd:duration a rdfs:Datatype .

#################################################################
#
#    Object Properties
#
#################################################################

as:action a owl:ObjectProperty ;
  rdfs:label "action"@en;
  rdfs:comment "Specifies an potential action for the object"@en;
  rdfs:domain as:Object;
  rdfs:range as:Activity .

as:actor a owl:ObjectProperty ;
  rdfs:label "actor"@en ;
  rdfs:domain as:Activity ;
  rdfs:comment "Subproperty of as:attributedTo that identifies the primary actor"@en ;
  rdfs:subPropertyOf as:attributedTo ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf (as:Actor as:LinkNotHandler) .
  ] .

as:actorOf a owl:ObjectProperty ;
  rdfs:label "actorOf"@en ;
  rdfs:subPropertyOf as:attributedWith ;
  rdfs:range as:Activity ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf (as:Actor as:LinkNotHandler) .
  ] ;
  owl:inverseOf as:actor .

as:attributedTo a owl:ObjectProperty ;
  rdfs:label "attributedTo"@en;
  rdfs:comment "Identifies an entity to which an object is attributed"@en;
  rdfs:subPropertyOf prov:wasAttributedTo ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf (as:Object as:LinkNotHandler) .
  ] ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf (as:Object as:LinkNotHandler) .
  ] ; .

as:attributedWith a owl:ObjectProperty ;
  rdfs:label "attributedWith"@en;
  rdfs:comment "Identifies entities to which an object is attribute"@en;
  rdfs:range [
    a owl:Class ;
    owl:unionOf (as:Object as:LinkNotHandler).
  ] ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf (as:Object as:LinkNotHandler) .
  ] ;
  owl:inverseOf as:attributedTo .

as:attachedTo a owl:ObjectProperty ;
  rdfs:label "attachedTo"@en ;
  rdfs:comment "Identifies an entity this object is attached to"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf (as:LinkNotHandler as:Object) .
  ] ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf (as:LinkNotHandler as:Object) .
  ] ; 
  owl:inverseOf as:attachment .

as:attachment a owl:ObjectProperty ;
  rdfs:label "attachment"@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:LinkNotHandler as:Object ) .
  ] ;
  rdfs:domain as:Object ;
  owl:equivalentProperty as:attachments .

as:attachments a owl:ObjectProperty, 
         owl:DeprecatedProperty ;
  rdfs:label "attachments"@en ;
  rdfs:domain as:Object ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:author a owl:ObjectProperty,
            owl:DeprecatedProperty ;
  rdfs:label "author"@en ;
  rdfs:comment "Identifies the author of an object. Deprecated. Use as:attributedTo instead"@en;
  rdfs:domain as:Content ;
  rdfs:subPropertyOf as:attributedTo ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] .

as:authorOf a owl:ObjectProperty,
              owl:DeprecatedProperty ;
  rdfs:label "authorOf"@en;
  rdfs:comment "Identifies an object for which this actor is an author. Deprecated. Use as:attributedWith instead"@en;
  rdfs:subPropertyOf as:attributedWith ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] ;
  rdfs:domain as:Actor ;
  owl:inverseOf as:author .

as:bcc a owl:ObjectProperty ; 
  rdfs:label "bcc"@en ;      
  rdfs:domain as:Activity ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] .

as:bto a owl:ObjectProperty ;  
  rdfs:label "bto"@en ;     
  rdfs:domain as:Activity ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] .

as:cc a owl:ObjectProperty ;
  rdfs:label "cc"@en ;
  rdfs:domain as:Activity ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] .

as:context a owl:ObjectProperty ;
  rdfs:label "context"@en ;
  rdfs:comment "Specifies the context within which an object exists or an activity was performed"@en ;
  rdfs:domain as:Object ;
  rdfs:range [
    a owl:Class ;
      owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:contextOf .

as:contextOf a owl:ObjectProperty ;
  rdfs:label "contextOf"@en;
  rdfs:domain [
    a owl:Class ;
      owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] ;
  rdfs:range [
    a owl:Class ;
      owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:context .

as:current a owl:FunctionalProperty ,
             owl:ObjectProperty ;
  rdfs:label "current"@en ;
  rdfs:domain as:Collection ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Collection as:LinkNotHandler ) .
  ] .

as:first a owl:FunctionalProperty ,
           owl:ObjectProperty ;
  rdfs:label "first"@en ;
  rdfs:domain as:Collection ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Collection as:LinkNotHandler ) .
  ] .

as:generator a owl:ObjectProperty ;
  rdfs:label "generator"@en ;
  rdfs:domain as:Object ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:generatorOf a owl:ObjectProperty ;
  rdfs:label "generatorOf"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf (as:Object as:LinkNotHandler) .
  ] ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:generator .

as:handlerFor a owl:ObjectProperty ;      
  rdfs:label "handlerFor"@en ;
  rdfs:comment "Describes the Activity an ActivityHandler is intended to carry out"@en ;
  rdfs:range as:Activity ;
  rdfs:domain as:ActivityHandler ;
  owl:inverseOf as:using .

as:hasExpectedInput a owl:ObjectProperty ;
  rdfs:label "hasExpectedInput"@en ;
  rdfs:comment "Describes something that an ActivityHandler expects as input"@en ;
  rdfs:range owl:Thing ;
  rdfs:domain as:ActivityHandler .

as:hasPotentialResult a owl:ObjectProperty ;
  rdfs:label "hasPotentialResult"@en ;
  rdfs:comment "Describes a potential result of an ActivityHandler"@en ;
  rdfs:range owl:Thing ;
  rdfs:domain as:ActivityHandler .

as:hasPreference a owl:ObjectProperty ;
  rdfs:label "hasPreference"@en ;
  rdfs:comment "Describes something that an ActivityHandler prefers"@en ;
  rdfs:range owl:Thing ;
  rdfs:domain as:ActivityHandler .

as:hasRequirement a owl:ObjectProperty ;
  rdfs:label "hasRequirement"@en ;
  rdfs:comment "Describes something that an ActivityHandler requires"@en ;
  rdfs:range owl:Thing ;
  rdfs:domain as:ActivityHandler .

as:hreftemplate a owl:FunctionalProperty ,
                  owl:ObjectProperty ;
  rdfs:label "hreftemplate"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf (as:BrowserView as:HttpRequest) .
  ] ;
  rdfs:range as:UrlTemplate .

as:icon a owl:ObjectProperty ;
  rdfs:label "icon"@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Image as:LinkNotHandler ) .
  ] ;
  rdfs:domain as:Object .

as:iconFor a owl:ObjectProperty ;
  rdfs:label "iconFor"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Image as:LinkNotHandler ) .
  ] ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:icon .

as:image a owl:ObjectProperty ;
  rdfs:label "image"@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Image as:LinkNotHandler ) .
  ] ;
  rdfs:domain as:Object .

as:imageOf a owl:ObjectProperty ;
  rdfs:label "imageOf"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Image as:LinkNotHandler ) .
  ] ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:image .

as:inReplyTo a owl:ObjectProperty ;
  rdfs:label "inReplyTo"@en ;
  rdfs:domain as:Object ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:instrument a owl:ObjectProperty ;
  rdfs:label "instrument"@en ; 
  rdfs:domain as:Activity ;
  rdfs:subPropertyOf prov:used ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:instrumentOf a owl:ObjectProperty ; 
  rdfs:label "instrumentOf"@en ;       
  rdfs:range as:Activity ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:instrument .

as:items a owl:ObjectProperty, 
           owl:FunctionalProperty ;  
  rdfs:label "items"@en ;       
  rdfs:domain as:Collection ;
  rdfs:subPropertyOf prov:hadMember ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf (
      [
        a owl:Class ;
        owl:unionOf ( as:Object as:LinkNotHandler ) .
      ]
      as:OrderedItems
    ) .
  ] .

as:last a owl:FunctionalProperty ,
          owl:ObjectProperty ; 
  rdfs:label "last"@en ;
  rdfs:domain as:Collection ;      
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Collection as:LinkNotHandler ) .
  ] .

as:location a owl:ObjectProperty ;   
  rdfs:label "location"@en ; 
  rdfs:domain as:Object ;
  rdfs:subPropertyOf prov:atLocation ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:locationOf a owl:ObjectProperty ;
  rdfs:label "locationOf"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:location .

as:memberOf a owl:ObjectProperty ; 
  rdfs:label "memberOf"@en ;   
  rdfs:range as:Collection ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:items .

as:next a owl:FunctionalProperty ,
          owl:ObjectProperty ;
  rdfs:label "next"@en ;
  rdfs:domain as:Collection ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Collection as:LinkNotHandler ) .
  ] .

as:object a owl:ObjectProperty ;
  rdfs:label "object"@en ;
  rdfs:domain as:Activity ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:objectOf a owl:ObjectProperty ;
  rdfs:label "objectOf"@en ;
  rdfs:comment "Identifies Activities for which this object is the object of"@en ;
  rdfs:range as:Activity ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ; 
  owl:inverseOf as:object .

as:oneOf a owl:ObjectProperty ;
  rdfs:label "oneOf"@en ;
  rdfs:comment "Describes a possible exclusive answer or option for a question."@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler )
  ] ;
  rdfs:domain as:Question .

as:anyOf a owl:ObjectProperty ;
  rdfs:label "oneOf"@en ;
  rdfs:comment "Describes a possible inclusive answer or option for a question."@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler )
  ] ;
  rdfs:domain as:Question .

as:parameter a owl:ObjectProperty ;
  rdfs:label "parameter"@en ;
  rdfs:comment "A parameter"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf (as:HtmlForm as:UrlTemplate)  .
  ] ;
  rdfs:range as:Parameter .

as:participant a owl:ObjectProperty ;   
  rdfs:label "participant"@en ;    
  rdfs:domain as:Activity ;
  rdfs:subPropertyOf prov:wasAssociatedWith ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] .

as:participantOf a owl:ObjectProperty ;   
  rdfs:label "participantOf"@en ;      
  rdfs:range as:Activity ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:participant .

as:prev a owl:FunctionalProperty ,
          owl:ObjectProperty ;
  rdfs:label "prev"@en ;
  rdfs:domain as:Collection ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Collection as:LinkNotHandler ) .
  ] .

as:preview a owl:ObjectProperty ;
  rdfs:label "preview"@en ;   
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:previewOf a owl:ObjectProperty ;
  rdfs:label "previewOf"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:preview .

as:provider a owl:ObjectProperty ; 
  rdfs:label "provider"@en ;   
  rdfs:domain as:Object ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:providerOf a owl:ObjectProperty ; 
  rdfs:label "providerOf"@en ;     
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:provider .

as:replies a owl:ObjectProperty ;  
  rdfs:label "replies"@en ; 
  rdfs:range as:Collection ;
  rdfs:domain as:Object .

as:result a owl:ObjectProperty ;  
  rdfs:label "result"@en ;
  rdfs:domain as:Activity ;
  rdfs:subPropertyOf prov:generated;
  rdfs:subPropertyOf as:attributedWith;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:resultOf a owl:ObjectProperty ;
  rdfs:label "resultOf"@en ;
  rdfs:range as:Activity ;
  rdfs:subPropertyOf prov:wasGeneratedBy ;
  rdfs:subPropertyOf as:attributedTo ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ; 
  owl:inverseOf as:result .

as:role a owl:ObjectProperty ;
  rdfs:label "role"@en;
  rdfs:comment "Identifies the semantic role of a Parameter."@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf (as:Object as:LinkNotHandler ) .
  ] ;
  rdfs:domain as:Parameter .

as:scope a owl:ObjectProperty ;
  rdfs:label "scope"@en ;
  rdfs:domain as:Object ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:scopeOf a owl:ObjectProperty ;
  rdfs:label "scopeOf"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ; 
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:scope .

as:self a owl:FunctionalProperty ,
          owl:ObjectProperty ;
  rdfs:label "self"@en ;
  rdfs:domain as:Collection ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Collection as:LinkNotHandler ) .
  ] .

as:shape a owl:ObjectProperty ;         
  rdfs:label "shape"@en ;
  rdfs:comment "Describes the data shape of a payload"@en ;
  rdfs:range owl:Thing ;
  rdfs:domain [ 
    a owl:Class ;
    owl:unionOf (
      as:HttpHeader as:Parameter as:Payload as:PossibleAnswer )  .
  ] .

as:tag a owl:ObjectProperty ;
  rdfs:label "tag"@en ;
  rdfs:domain as:Object ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:tagOf a owl:ObjectProperty ;  
  rdfs:label "tagOf"@en ;       
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;  
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:inverseOf as:tag .

as:tags a owl:ObjectProperty, 
        owl:DeprecatedProperty ; 
  rdfs:label "tags"@en ;       
  rdfs:domain as:Object ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  owl:equivalentProperty as:tag ;.

as:target a owl:ObjectProperty ; 
  rdfs:label "target"@en ; 
  rdfs:domain as:Activity ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:targetOf a owl:ObjectProperty ;
  rdfs:label "targetOf"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  rdfs:range as:Activity ;
  owl:inverseOf as:target .

as:origin a owl:ObjectProperty ;
  rdfs:label "origin"@en ;
  rdfs:comment "For certain activities, specifies the entity from which the action is directed."@en ;
  rdfs:domain as:Activity ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] .

as:originOf a owl:ObjectProperty ;
  rdfs:label "originOf"@en ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:LinkNotHandler ) .
  ] ;
  rdfs:range as:Activity ;
  owl:inverseOf as:origin .

as:to a owl:ObjectProperty ;  
  rdfs:label "to"@en ;    
  rdfs:domain as:Activity ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:Actor as:LinkNotHandler ) .
  ] .

as:url a owl:ObjectProperty ;  
  rdfs:label "url"@en ;   
  rdfs:comment "Specifies a link to a specific representation of the Object"@en ;  
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( as:LinkNotHandler owl:Thing ) .
  ] ;
  rdfs:domain as:Object .

as:using a owl:ObjectProperty ;
  rdfs:label "using"@en ;
  rdfs:comment "Describes an ActivityHandler that can be used to carry out an Activity"@en ;
  rdfs:domain as:Activity ;
  rdfs:range as:ActivityHandler .


#################################################################
#
#    Data properties
#
#################################################################

as:accuracy a owl:DatatypeProperty ,
            owl:FunctionalProperty ;
  rdfs:label "accuracy"@en ;
  rdfs:comment "Specifies the accuracy around the point established by the longitude and latitude"@en ;
  rdfs:domain as:Place ;
  rdfs:range [
    a rdfs:Datatype ;
    owl:onDatatype xsd:float ;
    owl:withRestrictions (
      [ xsd:minInclusive "0.0"^^xsd:float ]
    ) .
  ] .

as:alias a owl:DatatypeProperty ,
           owl:FunctionalProperty ;
  rdfs:label "alias"@en ;
  rdfs:comment "An alternative, domain specific alias for an object"@en ;
  rdfs:range xsd:anyURI ;
  rdfs:domain as:Object .

as:altitude a owl:DatatypeProperty ,
      owl:FunctionalProperty ;
  rdfs:label "altitude"@en ;
  rdfs:comment "The altitude of a place"@en;
  rdfs:domain as:Place ;
  rdfs:range xsd:float .

as:browserContext a owl:DatatypeProperty ,
    owl:FunctionalProperty ;
  rdfs:label "browserContext"@en ;
  rdfs:comment "Identifies the browser context name for a BrowserView, as defined by HTML5"@en ;
  rdfs:range [
    a rdfs:Datatype ;
    owl:unionOf(
      [
        a owl:Class ;
        owl:oneOf ( "_blank" "_self" "_parent" "_top" ) .
      ]
      [
        a rdfs:Datatype ;
        owl:onDatatype xsd:string ;
        owl:withRestrictions (
          [ xsd:pattern "[^_|.].*" ]
        ) .
      ]
    ) .
  ] ;
  rdfs:domain as:BrowserView .

as:confirm a owl:DatatypeProperty ,
           owl:FunctionalProperty ;
  rdfs:label "confirm"@en ;
  rdfs:comment "True if the Action Handler must be confirmed prior to invocation"@en ;
  rdfs:range xsd:boolean ;
  rdfs:domain as:ActivityHandler .

as:content a owl:DatatypeProperty ;  
  rdfs:label "content"@en ; 
  rdfs:comment "The content of the object."@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf( rdf:langString xsd:string ) .
  ] ;
  rdfs:domain as:Object .

as:displayName a owl:DatatypeProperty ;
  rdfs:label "displayName"@en ;
  rdfs:displayName "The default, plain-text display name of the object or link."@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf( rdf:langString xsd:string ) .
  ] ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:Link) .
  ].

as:downstreamDuplicates a owl:DatatypeProperty,
          owl:DeprecatedProperty ;
  rdfs:label "downstreamDuplicates"@en ;
  rdfs:range xsd:anyURI ;
  rdfs:domain as:Object .

as:duration a owl:DatatypeProperty ,
  owl:FunctionalProperty ;
  rdfs:label "duration"@en ;
  rdfs:comment "The duration of the object"@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( xsd:duration xsd:nonNegativeInteger ) .
  ];
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Content as:Link ) .
  ] .


as:endTime a owl:DatatypeProperty ,
    owl:FunctionalProperty ;
  rdfs:label "endTime"@en ;
  rdfs:comment "The ending time of the object"@en ;
  rdfs:subPropertyOf prov:endedAtTime ;
  rdfs:range xsd:dateTime ;
  rdfs:domain as:Object .

as:height a owl:DatatypeProperty ,
  owl:FunctionalProperty ;
  rdfs:label "height"@en ;
  rdfs:comment "The display height expressed as device independent pixels"@en ;
  rdfs:range xsd:nonNegativeInteger ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Content as:Link ) .
  ] .

as:href a owl:DatatypeProperty ,
  owl:FunctionalProperty ;
  rdfs:label "href"@en ;
  rdfs:comment "The target URI of the Link"@en ;
  rdfs:range xsd:anyURI ;
  rdfs:domain as:Link .

as:hreflang a owl:DatatypeProperty ,
      owl:FunctionalProperty ;
  rdfs:label "hreflang"@en ;
  rdfs:comment "A hint about the language of the referenced resource"@en ;
  rdfs:range xsd:language ;
  rdfs:domain as:Link .

as:id a owl:DatatypeProperty ,
        owl:FunctionalProperty,
        owl:DeprecatedProperty ;
  rdfs:label "id"@en ;
  rdfs:range xsd:anyURI ;
  rdfs:domain [ 
    a owl:Class ;
    owl:unionOf (as:Link as:Object).
  ] .

as:itemsPerPage a owl:DatatypeProperty ,
          owl:FunctionalProperty ;
  rdfs:label "itemsPerPage"@en ;
  rdfs:comment "The maximum number of items per page in a logical Collection"@en ;
  rdfs:range xsd:nonNegativeInteger ;
  rdfs:domain as:Collection .

as:latitude a owl:DatatypeProperty ,
      owl:FunctionalProperty ;
  rdfs:label "latitude"@en ;
  rdfs:comment "The latitude"@en ;
  rdfs:range xsd:float ;
  rdfs:domain as:Place .

as:longitude a owl:DatatypeProperty ,
       owl:FunctionalProperty ;
  rdfs:label "longitude"@en ;
  rdfs:comment "The longitude"@en ;
  rdfs:range xsd:float ;
  rdfs:domain as:Place .

as:mediaType a owl:DatatypeProperty ,
       owl:FunctionalProperty ;
  rdfs:label "mediaType"@en ;
  rdfs:comment "The MIME Media Type"@en ;
  rdfs:range xsd:string ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:EmbeddedView as:Link as:Payload ) .
  ] .

as:method a owl:DatatypeProperty ,
    owl:FunctionalProperty ;
  rdfs:label "method"@en ;
  rdfs:comment "The HTTP Method to use"@en ;
  rdfs:range xsd:token ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:BrowserView as:HttpRequest ).
  ] .

as:name a owl:DatatypeProperty ,
  owl:FunctionalProperty ;
  rdfs:label "name"@en ;
  rdfs:comment "The name of a Parameter or HttpHeader"@en ;
  rdfs:range xsd:string ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:HttpHeader as:Parameter ) .
  ] .

as:objectType a owl:DatatypeProperty ,
        owl:FunctionalProperty,
        owl:DeprecatedProperty ;
  rdfs:label "objectType"@en ;
  rdfs:range xsd:anyURI ;
  rdfs:domain as:Object .

as:priority a owl:DatatypeProperty ,
      owl:FunctionalProperty ;
  rdfs:label "priority"@en ;
  rdfs:comment "Specifies the relative priority of the Activity"@en ;
  rdfs:domain as:Activity ;
  rdfs:range [ 
    a rdfs:Datatype ;
    owl:onDatatype xsd:float ;
    owl:withRestrictions ( 
      [ xsd:minInclusive "0.0"^^xsd:float ]
      [ xsd:maxInclusive "1.0"^^xsd:float ]
    )] .

as:published a owl:DatatypeProperty ,
      owl:FunctionalProperty ;
  rdfs:label "published"@en ;
  rdfs:comment "Specifies the date and time the object was published"@en ;
  rdfs:subPropertyOf prov:generatedAtTime ;
  rdfs:range xsd:dateTime ;
  rdfs:domain as:Object .

as:radius a owl:DatatypeProperty ,
            owl:FunctionalProperty ;
  rdfs:label "radius"@en ;
  rdfs:comment "Specifies a radius around the point established by the longitude and latitude"@en ;
  rdfs:domain as:Place ;
  rdfs:range [
    a rdfs:Datatype ;
    owl:onDatatype xsd:float ;
    owl:withRestrictions (
      [ xsd:minInclusive "0.0"^^xsd:float ]
    ) .
  ] .

as:rating a owl:DatatypeProperty ,
    owl:FunctionalProperty ;
  rdfs:label "rating"@en ;
  rdfs:comment "A numeric rating (>= 0.0, <= 5.0) for the object"@en ;
  rdfs:domain as:Object ;
  rdfs:range [ 
    a rdfs:Datatype ;
    owl:onDatatype xsd:float ;
    owl:withRestrictions ( 
      [ xsd:minInclusive "0.0"^^xsd:float ]
      [ xsd:maxInclusive "5.0"^^xsd:float ]
    )] .

as:rel a owl:DatatypeProperty ;
  rdfs:label "rel"@en ;
  rdfs:comment "The RFC 5988 or HTML5 Link Relation associated with the Link"@en ;
  rdfs:range xsd:string ;
  rdfs:domain as:Link .

as:optional a owl:DatatypeProperty ,
              owl:FunctionalProperty ;
  rdfs:label "optional"@en ;
  rdfs:comment "Indicates if the parameter is optional. By default, all parameters are considered to be required."@en ;
  rdfs:range xsd:boolean ;
  rdfs:domain as:Parameter .

as:sandbox a owl:DatatypeProperty ,
     owl:FunctionalProperty ;
  rdfs:label "sandbox"@en ;
  rdfs:comment "Browser sandbox policy for EmbeddedView and BrowserView"@en ;
  rdfs:range xsd:string ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:BrowserView as:EmbeddedView ).
  ] .

as:startIndex a owl:DatatypeProperty ,
        owl:FunctionalProperty ;
  rdfs:label "startIndex"@en ;
  rdfs:comment "In a strictly ordered logical collection, specifies the index position of the first item in the items list"@en ;
  rdfs:range xsd:nonNegativeInteger ;
  rdfs:domain as:OrderedCollection .

as:startTime a owl:DatatypeProperty ,
       owl:FunctionalProperty ;
  rdfs:label "startTime"@en ;
  rdfs:comment "The starting time of the object"@en ;
  rdfs:subPropertyOf prov:startedAtTime ;
  rdfs:range xsd:dateTime ;
  rdfs:domain as:Object .

as:status a owl:DatatypeProperty ,
            owl:FunctionalProperty ;
  rdfs:label "status"@en ;
  rdfs:comment "Explicitly identifies the current state of an Activity."@en ;
  rdfs:domain as:Activity ;
  rdfs:range [
    a rdfs:Datatype ;
    owl:unionOf (
      [
        a rdfs:Datatype ;
        owl:oneOf (
          "pending"
          "active"
          "completed"
          "canceled"
          "voided"
        ) .
      ]
      xsd:anyURI
    ) .
  ] .

as:summary a owl:DatatypeProperty ;
  rdfs:label "summary"@en ;
  rdfs:comment "A short summary of the object"@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( rdf:langString xsd:string ).
  ] ;
  rdfs:domain as:Object .

as:template a owl:DatatypeProperty ,
  owl:FunctionalProperty ;
  rdfs:label "template"@en ;
  rdfs:comment "A URL Template as defined in RFC 6570"@en ;
  rdfs:range xsd:string ;
  rdfs:domain as:UrlTemplate .

as:title a owl:DatatypeProperty ;
  rdfs:label "title"@en ;
  rdfs:comment "The title of the object, HTML markup is permitted."@en ;
  rdfs:range [
    a owl:Class ;
    owl:unionOf ( rdf:langString xsd:string ).
  ] ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Object as:Link ) .
  ] .

as:totalItems a owl:DatatypeProperty ,
        owl:FunctionalProperty ;
  rdfs:label "totalItems"@en ;
  rdfs:comment "The total number of items in a logical collection"@en ;
  rdfs:range xsd:nonNegativeInteger ;
  rdfs:domain as:Collection .

as:units a owl:DatatypeProperty ,
          owl:FunctionalProperty ;
  rdfs:label "units"@en ;
  rdfs:comment "Identifies the unit of measurement used by the radius, altitude and accuracy properties. The value can be expressed either as one of a set of predefined units or as a well-known common URI that identifies units."@en ;
  rdfs:range [
    a rdfs:Datatype ;
    owl:unionOf(
      [ a rdfs:Datatype ;
        owl:oneOf(
          "inches"
          "feet" 
          "miles" 
          "cm" 
          "m" 
          "km"
        )
      ]
      xsd:anyURI ) .
  ] ;
  rdfs:domain as:Place .

as:updated a owl:DatatypeProperty ,
     owl:FunctionalProperty ;
  rdfs:label "updated"@en ;
  rdfs:comment "Specifies when the object was last updated"@en ;
  rdfs:range xsd:dateTime ;
  rdfs:domain as:Object .

as:upstreamDuplicates a owl:DatatypeProperty,
        owl:DeprecatedProperty ;
  rdfs:label "upstreamDuplicates"@en ;
  rdfs:range xsd:anyURI ;
  rdfs:domain as:Object .

as:verb a owl:DatatypeProperty ,
  owl:FunctionalProperty,
  owl:DeprecatedProperty ;
  rdfs:label "verb"@en ;
  rdfs:range xsd:anyURI ;
  rdfs:domain as:Activity .

as:width a owl:DatatypeProperty ,
   owl:FunctionalProperty ;
  rdfs:label "width"@en ;
  rdfs:comment "Specifies the preferred display width of the content, expressed in terms of device independent pixels."@en ;
  rdfs:range xsd:nonNegativeInteger ;
  rdfs:domain [
    a owl:Class ;
    owl:unionOf ( as:Content as:Link ).
  ] .


#################################################################
#
#    Classes
#
#################################################################

as:Accept a owl:Class ;  
  rdfs:label "Accept"@en ;  
  rdfs:subClassOf as:Respond ;
  owl:equivalentClass prov:Accept ;
  rdfs:comment "Actor accepts the Object"@en .

as:Activity a owl:Class ;
  rdfs:label "Activity"@en ;
  rdfs:subClassOf as:Object ;
  rdfs:subClassOf prov:Activity ;
  owl:equivalentClass prov:Activity ;
  rdfs:comment "An Object representing some form of Action that has been taken"@en .

as:Block a owl:Class ;
  rdfs:label "Block"@en ;
  rdfs:subClassOf as:Ignore .

as:IntransitiveActivity a owl:Class ;
  rdfs:label "IntransitiveActivity"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:subClassOf [
    a owl:Restriction ;
      owl:onProperty as:object ;
      owl:maxCardinality "0"^^xsd:nonNegativeInteger .
  ] ;
  rdfs:comment "An Activity that has no direct object"@en .

as:ActivityHandler a owl:Class ;
  rdfs:label "ActivityHandler"@en ;
  rdfs:comment "Describes a way of carrying out an Activity"@en .

as:Actor a owl:Class ;         
  rdfs:label "Actor"@en ;
  rdfs:subClassOf as:Object ;
  rdfs:subClassOf prov:Agent ;
  owl:equivalentClass prov:Agent ;
  rdfs:comment "Any entity that can do something"@en .

as:Achieve a owl:Class ;
  rdfs:label "Achieve"@en ;
  rdfs:subClassOf as:Object ;
  rdfs:comment "The actor achieves the object"@en .

as:Add a owl:Class ;       
  rdfs:label "Add"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Add an Object or Link to Something"@en .

as:Album a owl:Class ;         
  rdfs:label "Album"@en ;
  rdfs:subClassOf as:Collection ;
  rdfs:comment "An Album.. typically a collection of photos"@en .

as:Announce a owl:Class ;
  rdfs:label "Announce"@en;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "Actor announces the object to the target"@en .

as:Application a owl:Class ;
  rdfs:label "Application"@en ;
  rdfs:subClassOf as:Actor ;
  rdfs:subClassOf prov:SoftwareAgent ;
  owl:equivalentClass prov:SoftwareAgent ;
  rdfs:comment "Represents a software application of any sort"@en .

as:Arrive a owl:Class ;
  rdfs:label "Arrive"@en ;  
  rdfs:subClassOf as:IntransitiveActivity ;
  rdfs:comment "To Arrive Somewhere (can be used, for instance, to indicate that a particular entity is currently located somewhere, e.g. a \"check-in\")"@en .

as:Article a owl:Class ;   
  rdfs:label "Article"@en ; 
  rdfs:subClassOf as:Content ;
  rdfs:comment "A written work. Typically several paragraphs long. For example, a blog post or a news article."@en .

as:Assign a owl:Class ;
  rdfs:label "Assign"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "The actor is assigning the object to the target"@en .

as:Audio a owl:Class ;
  rdfs:label "Audio"@en ;
  rdfs:subClassOf as:Document ;
  rdfs:comment "An audio file"@en .

as:BrowserView a owl:Class ;
  rdfs:label "BrowserView"@en ;
  rdfs:subClassOf as:ActivityHandler ,
                  as:Link ;
  rdfs:comment "Describes how to carry out an Activity using a Browser View"@en .

as:Collection a owl:Class ;      
  rdfs:label "Collection"@en ;
  rdfs:subClassOf as:Object ;
  rdfs:subClassOf prov:Collection ;
  owl:equivalentClass prov:Collection ;
  rdfs:comment "An ordered or unordered collection of Objects or Links"@en .

as:Complete a owl:Class ;
  rdfs:label "Complete"@en;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "The actor has completed the object"@en .

as:Confirm a owl:Class ;
  rdfs:label "Confirm"@en ;
  rdfs:subClassOf as:Respond ;
  rdfs:comment "The actor is confirming the object"@en .

as:Connect a owl:Class ;     
  rdfs:label "Connect"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "The Actor is wishing to establish a connection with the Object. For instance, when one person is requesting to be added to another persons friends list."@en .

as:Content a owl:Class ;   
  rdfs:label "Content"@en ;
  rdfs:subClassOf as:Object ;
  rdfs:comment "An Object that has content"@en .

as:Create a owl:Class ;  
  rdfs:label "Create"@en ;
  owl:equivalentClass as:Post ;
  rdfs:subClassOf as:Activity ;
  owl:equivalentClass prov:Create;
  rdfs:comment "To Create Something"@en .

as:Delete a owl:Class ;  
  rdfs:label "Delete"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Delete Something"@en .

as:Device a owl:Class ;
  rdfs:label "Device"@en ;
  rdfs:subClassOf as:Actor ;
  rdfs:comment "Represents a physical hardware devices of any sort"@en .

as:Dislike a owl:Class ;
  rdfs:label "Dislike"@en;
  rdfs:subClassOf as:Respond ;
  rdfs:comment "The actor dislikes the object"@en .

as:Document a owl:Class ;
  rdfs:label "Document"@en ;
  rdfs:subClassOf as:Content ;
  rdfs:comment "Represents a digital document/file of any sort"@en .

as:EmbeddedView a owl:Class ;
  rdfs:label "EmbeddedView"@en ;
  rdfs:subClassOf as:ActivityHandler ,
                  as:Content ;
  rdfs:comment "Describes how to carry out an Activity using embedded content"@en .

as:Event a owl:Class ;
  rdfs:label "Event"@en ;
  rdfs:subClassOf as:Object ;
  rdfs:comment "An Event of any kind"@en .

as:Favorite a owl:Class ;    
  rdfs:label "Favorite"@en ;
  owl:equivalentClass as:Like ;
  rdfs:subClassOf as:Respond ;
  rdfs:comment "To Favorite/Like Something"@en .

as:Flag a owl:Class ;
  rdfs:label "Flag"@en;
  rdsf:subClassOf as:Respond ;
  rdfs:comment "To flag something (e.g. flag as inappropriate, flag as spam, etc)"@en .

as:Folder a owl:Class ;
  rdfs:label "Folder"@en ;
  rdfs:subClassOf as:Collection ;
  rdfs:comment "Typically, a collection of files"@en .

as:Follow a owl:Class ;
  rdfs:label "Follow"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Express Interest in Something"@en .

as:FriendRequest a owl:Class ;
  rdfs:label "FriendRequest"@en ;
  rdfs:subClassOf as:Connect ;
  rdfs:comment "A Friend Request"@en .

as:Give a owl:Class ;
  rdfs:label "Give"@en ;
  rdfs:subClassOf as:Offer ;
  rdfs:comment "To Give Something to Some recipient"@en .

as:Group a owl:Class ;         
  rdfs:label "Group"@en ;
  rdfs:subClassOf as:Actor ;
  rdfs:comment "A Group of any kind. Unlike an Organization, Group's may be informal in nature"@en .

as:HtmlForm a owl:Class ;    
  rdfs:label "HtmlForm"@en ;
  rdfs:comment "Describes an HTML Form. This is intended primary to be used as the value of \"shape\" on a Payload when the Payload is expected to be an HTML Form. The Payload's mediaType property specifies whether it's form encoded or url encoded."@en .

as:HttpHeader a owl:Class ;      
  rdfs:label "HttpHeader"@en ;
  rdfs:comment "Describes an HTTP Header. This is primarily intended for use as a \"Potential Input\" for an ActivityHandler, particularly the HttpRequest and BrowserView. It can also be used as a \"Potential Result\"."@en .

as:HttpRequest a owl:Class ;
  rdfs:label "HttpRequest"@en ;
  rdfs:subClassOf as:ActivityHandler ,
                  as:Link ;
  rdfs:comment "Describes how to carry out an Activity using an HttpRequest"@en .

as:Ignore a owl:Class ;
  rdfs:label "Ignore"@en ;
  rdfs:subClassOf as:Respond ;
  rdfs:comment "Actor is ignoring the Object"@en .

as:Image a owl:Class ;
  rdfs:label "Image"@en ;
  rdfs:subClassOf as:Document ;
  rdfs:comment "An Image file"@en .

as:Invite a owl:Class ;
  rdfs:label "Invite"@en ;
  rdfs:subClassOf as:Offer ;
  rdfs:comment "To invite someone or something to something"@en .

as:Join a owl:Class ;        
  rdfs:label "Join"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Join Something"@en .

as:Leave a owl:Class ;
  rdfs:label "Leave"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Leave Something"@en .

as:Like a owl:Class ;
  rdfs:label "Like"@en ;
  rdfs:subClassOf as:Respond ;
  rdfs:comment "To Like/Favorite Something"@en .

as:Experience a owl:Class;
  rdfs:label "Experience"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "The actor experienced the object"@en .

as:View a owl:Class ;
  rdfs:label "View"@en ;
  rdfs:subClassOf as:Experience ;
  rdfs:comment "The actor viewed the object"@en .

as:Watch a owl:Class ;
  rdfs:label "Watch"@en ;
  rdfs:subClassOf as:View ;
  rdfs:comment "The actor watched the object"@en .

as:Listen a owl:Class ;
  rdfs:label "Listen"@en ;
  rdfs:subClassOf as:Experience ;
  rdfs:comment "The actor listened to the object"@en .

as:Read a owl:Class ;
  rdfs:label "Read"@en ;
  rdfs:subClassOf as:View ;
  rdfs:comment "The actor read the object"@en .

as:Reservation a owl:Class ;
  rdfs:label "Reservation"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "The actor is creating a reservation for the object"@en ;

as:Respond a owl:Class ;
  rdfs:label "Respond"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "The actor responded to the object"@en .

as:Move a owl:Class ;
  rdfs:label "Move"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "The actor is moving the object. The target specifies where the object is moving to. The origin specifies where the object is moving from." .

as:Travel a owl:Class ;
  rdfs:label "Travel"@en ;
  rdfs:subClassOf as:IntransitiveActivity ;
  rdfs:comment "The actor is traveling to the target. The origin specifies where the actor is traveling from." .

as:Link a owl:Class ;
  rdfs:label "Link"@en ;
  owl:disjointWith as:Object ;
  rdfs:comment "Represents a qualified reference to another resource. Patterned after the RFC5988 Web Linking Model"@en .

as:Mention a owl:Class ;
  rdfs:label "Mention"@en ;
  rdfs:subClassOf as:Link ;
  rdfs:comment "A specialized Link that represents an @mention"@en .

as:Tag a owl:Class ;
  rdfs:label "Tag"@en ;
  rdfs:subClassOf as:Link ;
  rdfs:comment "A specialized Link tha represents a hashtag"@en .

as:LinkNotHandler a owl:Class ;
  rdfs:label "Links that are Not Handlers"@en ;
  rdfs:subClassOf as:Link ,
                  [ rdf:type owl:Class ;
                    owl:complementOf as:ActivityHandler
                  ] ;
  rdfs:comment "Represents instances of as:Link that are not also as:ActivityHandler"@en .

as:Note a owl:Class ;
  rdfs:label "Note"@en ;
  rdfs:subClassOf as:Content ;
  rdfs:comment "A Short note, typically less than a single paragraph. A \"tweet\" is an example, or a \"status update\""@en .

as:Object a owl:Class ;  
  rdfs:label "Object"@en ;
  rdfs:subClassOf prov:Entity ;
  owl:equivalentClass prov:Entity .

as:Offer a owl:Class ;
  rdfs:label "Offer"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Offer something to someone or something"@en .

as:OrderedCollection a owl:Class ;
  rdfs:label "OrderedCollection"@en ;
  rdfs:comment "A variation of Collection in which items are strictly ordered"@en;
  rdfs:subClassOf [
    a owl:Class;
    owl:intersectionOf (
      as:Collection
      [
        a owl:Restriction;
        owl:onProperty as:items ;
        owl:allValuesFrom [
          a owl:Class ;
          owl:intersectionOf (
            as:OrderedItems
            [
              a owl:Class ;
              owl:complementOf [
                a owl:Class ;
                owl:unionOf ( as:Object as:LinkNotHandler ) .
              ]
            ]
          ) .
        ] .
      ]
    ) .
  ] .

as:OrderedItems a owl:Class ;
  rdfs:label "OrderedItems"@en ;
  rdfs:comment "A rdf:List variant for Objects and Links"@en ;
  rdfs:subClassOf [
    a owl:Class;
    owl:intersectionOf (
      rdf:List 
      [
        a owl:Restriction;
        owl:onProperty rdf:first ;
        owl:allValuesFrom [
          a owl:Class ;
          owl:unionOf ( as:Object as:LinkNotHandler ) .
        ] .
      ] 
      [
        a owl:Restriction;
        owl:allValuesFrom as:OrderedItems ;
        owl:onProperty rdf:rest
      ]
    ) .
  ] .

as:Organization a owl:Class ;
  rdfs:label "Organization"@en ;
  rdfs:subClassOf as:Actor ;
  rdfs:subClassOf prov:Organization ;
  owl:equivalentClass prov:Organization ;
  rdfs:comment "A formal organization of any type"@en .

as:Page a owl:Class ;
  rdfs:label "Page"@en ;
  rdfs:subClassOf as:Content ;
  rdfs:comment "A Web Page"@en .

as:Parameter a owl:Class ;
  rdfs:label "Parameter"@en ;
  rdfs:comment "Represents a variable parameter, used typically with UrlTemplate and HtmlForm objects"@en .

as:Payload a owl:Class ;
  rdfs:label "Payload"@en ;
  rdfs:comment "Describes a data payload of any type, typically used to describe the input or output of an HttpRequest or BrowserView ActivityHandler. The mediaType property describes the MIME media type while the shape property describes the shape of the actual content"@en .

as:Person a owl:Class ;
  rdfs:label "Person"@en ;
  rdfs:subClassOf as:Actor ;
  rdfs:subClassOf prov:Person ;
  owl:equivalentClass prov:Person ;
  rdfs:comment "A Person"@en .

as:Place a owl:Class ;
  rdfs:label "Place"@en ;
  rdfs:subClassOf as:Object ;
  rdfs:subClassOf prov:Location ;
  owl:equivalentClass prov:Location ;
  rdfs:comment "A physical or logical location"@en .

as:PossibleAnswer a owl:Class ;
  rdfs:label "PossibleAnswer"@en;
  rdfs:comment "The as:PossibleAnswer is an as:Object that describes one possible answer to an as:Question. While the properties of the as:PossibleAnswer describe the PossibleAnswer itself, the shape property describes what form the actual answer to the question must take."@en ;
  rdfs:subClassOf as:Content .

as:Post a owl:Class ;
  rdfs:label "Post"@en ;
  rdfs:subClassOf as:Activity ;
  owl:equivalentClass prov:Publish ;
  rdfs:comment "To Post/Create Something"@en .

as:Process a owl:Class ;
  rdfs:label "Process"@en ;
  rdfs:subClassOf as:Actor ;
  rdfs:comment "Any form of short or long running process"@en .

as:Question a owl:Class ;
  rdfs:label "Question"@en;
  rdfs:subClassOf as:Content, as:IntransitiveActivity ;
  rdfs:comment "A question of any sort."@en .

as:Reject a owl:Class ;
  rdfs:label "Reject"@en ;
  rdfs:subClassOf as:Respond ;
  rdfs:comment "Actor rejects the Object"@en .

as:Remove a owl:Class ;
  rdfs:label "Remove"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Remove Something"@en .

as:Review a owl:Class ;  
  rdfs:label "Review"@en ;
  rdfs:subClassOf as:Respond ;
  rdfs:comment "To Review/Rate Something"@en .

as:Role a owl:Class ;
  rdfs:label "Role"@en ;
  rdfs:subClassOf as:Actor ;
  rdfs:subClassOf prov:Role ;
  owl:equivalentClass prov:Role ;
  rdfs:comment "A Role that can be assumed by a person, group, application, service, process, team or organization"@en .

as:Save a owl:Class ;
  rdfs:label "Save"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Save Something for later"@en .

as:Service a owl:Class ;   
  rdfs:label "Service"@en ;
  rdfs:subClassOf as:Actor ;
  rdfs:comment "A service provided by some entity"@en .

as:Share a owl:Class ;
  rdfs:label "Share"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Share Something with Someone"@en .

as:Story a owl:Class ;
  rdfs:label "Story"@en ;
  rdfs:subClassOf as:OrderedCollection ;
  rdfs:comment "An ordered collection of content sharing a common purpose or characteristic"@en .

as:TentativeAccept a owl:Class ;
  rdfs:label "TentativeAccept"@en ;
  rdfs:subClassOf as:Accept ;
  rdfs:comment "Actor tentatively accepts the Object"@en .

as:TentativeReject a owl:Class ;
  rdfs:label "TentativeReject"@en ;
  rdfs:subClassOf as:Reject ;
  rdfs:comment "Actor tentatively rejects the object"@en .

as:Undo a owl:Class ;
  rdfs:label "Undo"@en ;
  rdfs:subClassOf as:Activity ;
  rdfs:comment "To Undo Something. This would typically be used to indicate that a previous Activity has been undone."@en .

as:Update a owl:Class ;
  rdfs:label "Update"@en ;
  rdfs:comment "To Update/Modify Something"@en ;
  owl:equivalentClass prov:Modify ;
  rdfs:subClassOf as:Activity .

as:UrlTemplate a owl:Class ;
  rdfs:label "UrlTemplate"@en ;
  rdfs:comment "Describes a URL Template as defined by RFC 6570"@en .

as:Video a owl:Class ;
  rdfs:label "Video"@en ;
  rdfs:comment "A Video document of any kind."@en ;
  rdfs:subClassOf as:Document .

rdf:nil a as:OrderedItems .

Extended json-ld @context

{
  "@context": [
  {
    "dc": "http://purl.org/dc/elements/1.1/",
    "dct": "http://purl.org/dc/terms/",
    "dctypes": "http://purl.org/dc/dcmitype/",
    "foaf": "http://xmlns.com/foaf/0.1/",
    "vcard": "http://www.w3.org/2006/vcard/ns#",
    "org": "http://www.w3.org/ns/org#",
    "prov": "http://www.w3.org/ns/prov#",
    "geo": "http://www.w3.org/2003/01/geo/wgs84_pos#",
    "geos": "http://www.opengis.net/ont/geosparql#",
    "ical": "http://www.w3.org/2002/12/cal/ical#",
    "xsd": "http://www.w3.org/2001/XMLSchema#"
  },
  {
    "@vocab": "_:",
    "as": "http://www.w3.org/ns/activitystreams#",
    "Accept": "as:Accept",
    "Activity": "as:Activity",
    "ActivityHandler": "as:ActivityHandler",
    "Actor": "as:Actor",
    "Add": "as:Add",
    "Album": "as:Album",
    "Answer": "as:Answer",
    "Application": "as:Application",
    "Arrive": "as:Arrive",
    "Article": "as:Article",
    "Audio": "as:Audio",
    "BrowserView": "as:BrowserView",
    "Collection": "as:Collection",
    "ConnectionRequest": "as:ConnectionRequest",
    "Content": "as:Content",
    "Create": "as:Create",
    "Delete": "as:Delete",
    "Device": "as:Device",
    "Document": "as:Document",
    "EmbeddedView": "as:EmbeddedView",
    "Event": "as:Event",
    "Favorite": "as:Favorite",
    "Folder": "as:Folder",
    "Follow": "as:Follow",
    "FriendRequest": "as:FriendRequest",
    "Give": "as:Give",
    "Group": "as:Group",
    "HtmlForm": "as:HtmlForm",
    "HttpHeader": "as:HttpHeader",
    "HttpRequest": "as:HttpRequest",
    "Ignore": "as:Ignore",
    "Image": "as:Image",
    "Invite": "as:Invite",
    "Join": "as:Join",
    "Leave": "as:Leave",
    "Like": "as:Like",
    "Link": "as:Link",
    "Note": "as:Note",
    "Object": "as:Object",
    "Offer": "as:Offer",
    "OrderedCollection": "as:OrderedCollection",
    "Organization": "as:Organization",
    "Page": "as:Page",
    "Parameter": "as:Parameter",
    "Payload": "as:Payload",
    "Person": "as:Person",
    "Place": "as:Place",
    "PossibleAnswer": "as:PossibleAnswer",
    "Post": "as:Post",
    "Process": "as:Process",
    "Question": "as:Question",
    "Reject": "as:Reject",
    "Remove": "as:Remove",
    "Review": "as:Review",
    "Role": "as:Role",
    "Save": "as:Save",
    "Service": "as:Service",
    "Share": "as:Share",
    "Story": "as:Story",
    "TentativeAccept": "as:TentativeAccept",
    "TentativeReject": "as:TentativeReject",
    "Undo": "as:Undo",
    "Update": "as:Update",
    "UrlTemplate": "as:UrlTemplate",
    "Video": "as:Video",
    "action": {
      "@id": "as:action",
      "@type": "@id"
    },
    "actor": {
      "@id": "as:actor",
      "@type": "@id"
    },
    "attributedTo": {
      "@id": "as:attributedTo",
      "@type": "@id"
    },
    "attributedWith": {
      "@type": "as:attributedWith",
      "@type": "@id"
    },
    "actorOf": {
      "@id": "as:actorOf",
      "@type": "@id"
    },
    "attachedTo": {
      "@id": "as:attachedTo",
      "@type": "@id"
    },
    "attachment": {
      "@id": "as:attachment",
      "@type": "@id"
    },
    "attachments": {
      "@id": "as:attachments",
      "@type": "@id"
    },
    "author": {
      "@id": "as:author",
      "@type": "@id"
    },
    "authorOf": {
      "@id": "as:authorOf",
      "@type": "@id"
    },
    "bcc": {
      "@id": "as:bcc",
      "@type": "@id"
    },
    "bto": {
      "@id": "as:bto",
      "@type": "@id"
    },
    "cc": {
      "@id": "as:cc",
      "@type": "@id"
    },
    "current": {
      "@id": "as:current",
      "@type": "@id"
    },
    "first": {
      "@id": "as:first",
      "@type": "@id"
    },
    "generator": {
      "@id": "as:generator",
      "@type": "@id"
    },
    "generatorOf": {
      "@id": "as:generatorOf",
      "@type": "@id"
    },
    "handlerFor": {
      "@id": "as:handlerFor",
      "@type": "@id"
    },
    "hasExpectedInput": {
      "@id": "as:hasExpectedInput",
      "@type": "@id"
    },
    "hasPotentialResult": {
      "@id": "as:hasPotentialResult",
      "@type": "@id"
    },
    "hasPreference": {
      "@id": "as:hasPreference",
      "@type": "@id"
    },
    "hasRequirement": {
      "@id": "as:hasRequirement",
      "@type": "@id"
    },
    "hreftemplate": {
      "@id": "as:hreftemplate",
      "@type": "@id"
    },
    "icon": {
      "@id": "as:icon",
      "@type": "@id"
    },
    "iconFor": {
      "@id": "as:iconFor",
      "@type": "@id"
    },
    "image": {
      "@id": "as:image",
      "@type": "@id"
    },
    "imageOf": {
      "@id": "as:imageOf",
      "@type": "@id"
    },
    "inReplyTo": {
      "@id": "as:inReplyTo",
      "@type": "@id"
    },
    "instrument": {
      "@id": "as:instrument",
      "@type": "@id"
    },
    "instrumentOf": {
      "@id": "as:instrumentOf",
      "@type": "@id"
    },
    "items": {
      "@id": "as:items",
      "@type": "@id"
    },
    "orderedItems": {
      "@id": "as:items",
      "@type": "@id",
      "@container": "@list"
    },
    "last": {
      "@id": "as:last",
      "@type": "@id"
    },
    "location": {
      "@id": "as:location",
      "@type": "@id"
    },
    "locationOf": {
      "@id": "as:locationOf",
      "@type": "@id"
    },
    "memberOf": {
      "@id": "as:memberOf",
      "@type": "@id"
    },
    "next": {
      "@id": "as:next",
      "@type": "@id"
    },
    "object": {
      "@id": "as:object",
      "@type": "@id"
    },
    "objectOf": {
      "@id": "as:objectOf",
      "@type": "@id"
    },
    "option": {
      "@id": "as:option",
      "@type": "@id"
    },
    "optionOf": {
      "@id": "as:optionOf",
      "@type": "@id"
    },
    "parameter": {
      "@id": "as:parameter",
      "@type": "@id"
    },
    "participant": {
      "@id": "as:participant",
      "@type": "@id"
    },
    "participantOf": {
      "@id": "as:participantOf",
      "@type": "@id"
    },
    "prev": {
      "@id": "as:prev",
      "@type": "@id"
    },
    "preview": {
      "@id": "as:preview",
      "@type": "@id"
    },
    "previewOf": {
      "@id": "as:previewOf",
      "@type": "@id"
    },
    "provider": {
      "@id": "as:provider",
      "@type": "@id"
    },
    "providerOf": {
      "@id": "as:providerOf",
      "@type": "@id"
    },
    "replies": {
      "@id": "as:replies",
      "@type": "@id"
    },
    "result": {
      "@id": "as:result",
      "@type": "@id"
    },
    "resultOf": {
      "@id": "as:resultOf",
      "@type": "@id"
    },
    "scope": {
      "@id": "as:scope",
      "@type": "@id"
    },
    "scopeOf": {
      "@id": "as:scopeOf",
      "@type": "@id"
    },
    "self": {
      "@id": "as:self",
      "@type": "@id"
    },
    "shape": {
      "@id": "as:shape",
      "@type": "@id"
    },
    "tag": {
      "@id": "as:tag",
      "@type": "@id"
    },
    "tagOf": {
      "@id": "as:tagOf",
      "@type": "@id"
    },
    "tags": {
      "@id": "as:tag",
      "@type": "@id"
    },
    "target": {
      "@id": "as:target",
      "@type": "@id"
    },
    "targetOf": {
      "@id": "as:targetOf",
      "@type": "@id"
    },
    "to": {
      "@id": "as:to",
      "@type": "@id"
    },
    "url": {
      "@id": "as:url",
      "@type": "@id"
    },
    "using": {
      "@id": "as:using",
      "@type": "@id"
    },
    "alias": {
      "@id": "as:alias",
      "@type": "@id"
    },
    "altitude": {
      "@id": "as:altitude",
      "@type": "xsd:float"
    },
    "browserContext": "as:browserContext",
    "confirm": {
      "@id": "as:confirm",
      "@type": "xsd:boolean"
    },
    "content": "as:content",
    "contentMap": {
      "@id": "as:content",
      "@container": "@language"
    },
    "displayName": "as:displayName",
    "displayNameMap": {
      "@id": "as:displayName",
      "@container": "@language"
    },
    "downstreamDuplicates": "as:downStreamDuplicates",
    "duration": {
      "@id": "as:duration",
      "@type": "xsd:nonNegativeInteger"
    },
    "durationIso": {
      "@id": "as:duration",
      "@type": "xsd:duration"
    },
    "endTime": {
      "@id": "as:endTime",
      "@type": "xsd:dateTime"
    },
    "height": {
      "@id": "as:itemsPerPage",
      "@type": "xsd:nonNegativeInteger"
    },
    "href": {
      "@id": "as:href",
      "@type": "@id"
    },
    "hreflang": "as:hreflang",
    "id": "as:id",
    "itemsPerPage": {
      "@id": "as:itemsPerPage",
      "@type": "xsd:nonNegativeInteger"
    },
    "latitude": {
      "@id": "as:latitude",
      "@type": "xsd:float"
    },
    "longitude": {
      "@id": "as:longitude",
      "@type": "xsd:float"
    },
    "mediaType": "as:mediaType",
    "method": "as:method",
    "name": "as:name",
    "objectType": "as:objectType",
    "priority": {
      "@id": "as:priority",
      "@type": "xsd:float"
    },
    "published": {
      "@id": "as:published",
      "@type": "xsd:dateTime"
    },
    "radius": {
      "@id": "as:radius",
      "@type": "xsd:float"
    },
    "rating": {
      "@id": "as:rating",
      "@type": "xsd:float"
    },
    "rel": "as:rel",
    "sandbox": "as:sandbox",
    "startIndex": {
      "@id": "as:startIndex",
      "@type": "xsd:nonNegativeInteger"
    },
    "startTime": {
      "@id": "as:startTime",
      "@type": "xsd:dateTime"
    },
    "status": "as:status",
    "summary": "as:summary",
    "summaryMap": {
      "@id": "as:summary",
      "@container": "@language"
    },
    "template": "as:template",
    "title": "as:title",
    "titleMap": {
      "@id": "as:title",
      "@container": "@language"
    },
    "totalItems": {
      "@id": "as:totalItems",
      "@type": "xsd:nonNegativeInteger"
    },
    "units": "as:units",
    "updated": {
      "@id": "as:updated",
      "@type": "xsd:dateTime"
    },
    "upstreamDuplicates": "as:upstreamDuplicates",
    "verb": "as:verb",
    "width": {
      "@id": "as:width",
      "@type": "xsd:nonNegativeInteger"
    },
    "optional": {
      "@id": "as:optional",
      "@type": "xsd:boolean"
    },
    "role": {
      "@id": "as:role",
      "@type": "@id"
    }
  },
 {
    "geos:asWKT": { "@type": "geos:wktLiteral" },
    "geo:alt": {"@type": "xsd:float"},
    "geo:lat": {"@type": "xsd:float"},
    "geo:long": {"@type": "xsd:float"},
    "vcard:adr": { "@type": "@id" },
    "vcard:agent": { "@type": "@id" },
    "vcard:email": { "@type": "@id" },
    "vcard:geo": { "@type": "@id" },
    "vcard:hasAdditionalName": { "@type": "@id" },
    "vcard:hasAddress": { "@type": "@id" },
    "vcard:hasCalendarBusy": { "@type": "@id" },
    "vcard:hasCalendarLink": { "@type": "@id" },
    "vcard:hasCalendarRequest": { "@type": "@id" },
    "vcard:hasCategory": { "@type": "@id" },
    "vcard:hasCountryName": { "@type": "@id" },
    "vcard:hasEmail": { "@type": "@id" },
    "vcard:hasFN": { "@type": "@id" },
    "vcard:hasFamilyName": { "@type": "@id" },
    "vcard:hasGender": { "@type": "@id" },
    "vcard:hasGeo": { "@type": "@id" },
    "vcard:hasGivenName": { "@type": "@id" },
    "vcard:hasHonorificPrefix": { "@type": "@id" },
    "vcard:hasHonorificSuffix": { "@type": "@id" },
    "vcard:hasInstantMessage": { "@type": "@id" },
    "vcard:hasKey": { "@type": "@id" },
    "vcard:hasLanguage": { "@type": "@id" },
    "vcard:hasLocality": { "@type": "@id" },
    "vcard:hasLogo": { "@type": "@id" },
    "vcard:hasMember": { "@type": "@id" },
    "vcard:hasName": { "@type": "@id" },
    "vcard:hasNickname": { "@type": "@id" },
    "vcard:hasNote": { "@type": "@id" },
    "vcard:hasOrganizationName": { "@type": "@id" },
    "vcard:hasOrganizationUnit": { "@type": "@id" },
    "vcard:hasPhoto": { "@type": "@id" },
    "vcard:hasPostalCode": { "@type": "@id" },
    "vcard:hasRegion": { "@type": "@id" },
    "vcard:hasRelated": { "@type": "@id" },
    "vcard:hasRole": { "@type": "@id" },
    "vcard:hasSound": { "@type": "@id" },
    "vcard:hasSource": { "@type": "@id" },
    "vcard:hasStreetAddress": { "@type": "@id" },
    "vcard:hasTelephone": { "@type": "@id" },
    "vcard:hasTitle": { "@type": "@id" },
    "vcard:hasUID": { "@type": "@id" },
    "vcard:hasURL": { "@type": "@id" },
    "vcard:hasValue": { "@type": "@id" },
    "vcard:key": { "@type": "@id" },
    "vcard:logo": { "@type": "@id" },
    "vcard:n": { "@type": "@id" },
    "vcard:org": { "@type": "@id" },
    "vcard:photo": { "@type": "@id" },
    "vcard:rev": { "@type": "xsd:dateTime" },
    "vcard:sound": { "@type": "@id" },
    "vcard:tel": { "@type": "@id" },
    "vcard:url": { "@type": "@id" },
    "foaf:homepage": { "@type": "@id"},
    "foaf:isPrimaryTopicOf": { "@type": "@id"},
    "foaf:knows": { "@type": "@id"},
    "foaf:made": { "@type": "@id"},
    "foaf:maker": { "@type": "@id"},
    "foaf:mbox": { "@type": "@id"},
    "foaf:member": { "@type": "@id"},
    "foaf:page": { "@type": "@id"},
    "foaf:primaryTopic": { "@type": "@id"},
    "foaf:weblog": { "@type": "@id"},
    "foaf:account": { "@type": "@id"},
    "foaf:accountServiceHomepage": { "@type": "@id"},
    "foaf:basedNear": { "@type": "@id"},
    "foaf:currentProject": { "@type": "@id"},
    "foaf:depiction": { "@type": "@id"},
    "foaf:depicts": { "@type": "@id"},
    "foaf:focus": { "@type": "@id"},
    "foaf:img": { "@type": "@id"},
    "foaf:interest": { "@type": "@id"},
    "foaf:logo": { "@type": "@id"},
    "foaf:openid": { "@type": "@id"},
    "foaf:pastProject": { "@type": "@id"},
    "foaf:publications": { "@type": "@id"},
    "foaf:schoolHomepage": { "@type": "@id"},
    "foaf:thumbnail": { "@type": "@id"},
    "foaf:tipjar": { "@type": "@id"},
    "foaf:topic": { "@type": "@id"},
    "foaf:topic_interest": { "@type": "@id"},
    "foaf:workInfoHomepage": { "@type": "@id"},
    "foaf:workplaceHomepage": { "@type": "@id"},
    "foaf:fundedBy": { "@type": "@id"},
    "foaf:holdsAccount": { "@type": "@id"},
    "foaf:theme": { "@type": "@id"},
    "foaf:birthday": { "@type": "xsd:gMonthDay" },
    "foaf:age": { "@type": "xsd:integer" },
    "dct:accessRights": { "@type": "@id" },
    "dct:accrualMethod": { "@type": "@id" },
    "dct:accrualPeriodicity": { "@type": "@id" },
    "dct:accrualPolicy": { "@type": "@id" },
    "dct:audience": { "@type": "@id" },
    "dct:conformsTo": { "@type": "@id" },
    "dct:contributor": { "@type": "@id" },
    "dct:coverage": { "@type": "@id" },
    "dct:creator": { "@type": "@id" },
    "dct:educationLevel": { "@type": "@id" },
    "dct:extent": { "@type": "@id" },
    "dct:format": { "@type": "@id" },
    "dct:hasFormat": { "@type": "@id" },
    "dct:hasPart": { "@type": "@id" },
    "dct:hasVersion": { "@type": "@id" },
    "dct:instructionalMethod": { "@type": "@id" },
    "dct:isFormatOf": { "@type": "@id" },
    "dct:isPartOf": { "@type": "@id" },
    "dct:isReferencedBy": { "@type": "@id" },
    "dct:isReplacedBy": { "@type": "@id" },
    "dct:isRequiredBy": { "@type": "@id" },
    "dct:isVersionOf": { "@type": "@id" },
    "dct:license": { "@type": "@id" },
    "dct:mediator": { "@type": "@id" },
    "dct:medium": { "@type": "@id" },
    "dct:prevenance": { "@type": "@id" },
    "dct:publisher": { "@type": "@id" },
    "dct:references": { "@type": "@id" },
    "dct:relation": { "@type": "@id" },
    "dct:replaces": { "@type": "@id" },
    "dct:requires": { "@type": "@id" },
    "dct:rights": { "@type": "@id" },
    "dct:rightsHolder": { "@type": "@id" },
    "dct:source": { "@type": "@id" },
    "dct:spatial": { "@type": "@id" },
    "dct:subject": { "@type": "@id" },
    "dct:tableOfContents": { "@type": "@id" },
    "dct:temporal": { "@type": "@id" },
    "dct:type": { "@type": "@id" },
    "dc:contributor": { "@type": "@id" },
    "dc:coverage": { "@type": "@id" },
    "dc:creator": { "@type": "@id" },
    "dc:format": { "@type": "@id" },
    "dc:publisher": { "@type": "@id" },
    "dc:relation": { "@type": "@id" },
    "dc:rights": { "@type": "@id" },
    "dc:source": { "@type": "@id" },
    "dc:subject": { "@type": "@id" },
    "dc:type": { "@type": "@id" },
    "dct:available": { "@type": "xsd:dateTime"} ,
    "dct:created": { "@type": "xsd:dateTime"} ,
    "dct:date": { "@type": "xsd:dateTime"} ,
    "dct:dateAccepted": { "@type": "xsd:dateTime"} ,
    "dct:dateCopyrighted": { "@type": "xsd:dateTime"} ,
    "dct:dateSubmitted": { "@type": "xsd:dateTime"} ,
    "dct:issued": { "@type": "xsd:dateTime"} ,
    "dct:modified": { "@type": "xsd:dateTime"} ,
    "dc:date": { "@type": "xsd:dateTime"},
    "org:basedAt": { "@type": "@id" },
    "org:changedBy": { "@type": "@id" },
    "org:classification": { "@type": "@id" },
    "org:hasMember": { "@type": "@id" },
    "org:hasMembership": { "@type": "@id" },
    "org:hasPost": { "@type": "@id" },
    "org:hasPrimarySite": { "@type": "@id" },
    "org:hasRegisteredSite": { "@type": "@id" },
    "org:hasSite": { "@type": "@id" },
    "org:hasSubOrganization": { "@type": "@id" },
    "org:hasUnit": { "@type": "@id" },
    "org:headOf": { "@type": "@id" },
    "org:heldBy": { "@type": "@id" },
    "org:holds": { "@type": "@id" },
    "org:linkedTo": { "@type": "@id" },
    "org:location": { "@type": "@id" },
    "org:memberOf": { "@type": "@id" },
    "org:member": { "@type": "@id" },
    "org:organization": { "@type": "@id" },
    "org:originalOrganization": { "@type": "@id" },
    "org:postIn": { "@type": "@id" },
    "org:reportsTo": { "@type": "@id" },
    "org:resultedFrom": { "@type": "@id" },
    "org:resultingOrganization": { "@type": "@id" },
    "org:role": { "@type": "@id" },
    "org:roleProperty": { "@type": "@id" },
    "org:siteOf": { "@type": "@id" },
    "org:subOrganizationOf": { "@type": "@id" },
    "org:transitiveSubOrganizationOf": { "@type": "@id" },
    "org:unitOf": { "@type": "@id" },
    "prov:wasGeneratedBy": { "@type": "@id" },
    "prov:wasDerivedFrom": { "@type": "@id" },
    "prov:wasAttributedTo": { "@type": "@id" },
    "prov:used": { "@type": "@id" },
    "prov:wasInformedBy": { "@type": "@id" },
    "prov:wasAssociatedWith": { "@type": "@id" },
    "prov:actedOnBehalfOf": { "@type": "@id" },
    "prov:alternateOf": { "@type": "@id" },
    "prov:specializationOf": { "@type": "@id" },
    "prov:hadPrimarySource": { "@type": "@id" },
    "prov:wasQuotedFrom": { "@type": "@id" },
    "prov:wasRevisionOf": { "@type": "@id" },
    "prov:wasInvalidatedBy": { "@type": "@id" },
    "prov:hadMember": { "@type": "@id" },
    "prov:wasStartedBy": { "@type": "@id" },
    "prov:wasEndedBy": { "@type": "@id" },
    "prov:invalidated": { "@type": "@id" },
    "prov:influenced": { "@type": "@id" },
    "prov:atLocation": { "@type": "@id" },
    "prov:generated": { "@type": "@id" },
    "prov:wasInfluencedBy": { "@type": "@id" },
    "prov:qualifiedInfluence": { "@type": "@id" },
    "prov:qualifiedGeneration": { "@type": "@id" },
    "prov:qualifiedDerivation": { "@type": "@id" },
    "prov:qualifiedPrimarySource": { "@type": "@id" },
    "prov:qualifiedQuotation": { "@type": "@id" },
    "prov:qualifiedRevision": { "@type": "@id" },
    "prov:qualifiedAttribution": { "@type": "@id" },
    "prov:qualifiedInvalidation": { "@type": "@id" },
    "prov:qualifiedStart": { "@type": "@id" },
    "prov:qualifiedUsage": { "@type": "@id" },
    "prov:qualifiedCommunication": { "@type": "@id" },
    "prov:qualifiedAssociation": { "@type": "@id" },
    "prov:qualifiedEnd": { "@type": "@id" },
    "prov:qualifiedDelegation": { "@type": "@id" },
    "prov:influencer": { "@type": "@id" },
    "prov:entity": { "@type": "@id" },
    "prov:hadUsage": { "@type": "@id" },
    "prov:hadGeneration": { "@type": "@id" },
    "prov:activity": { "@type": "@id" },
    "prov:agent": { "@type": "@id" },
    "prov:hadPlan": { "@type": "@id" },
    "prov:hadActivity": { "@type": "@id" },
    "prov:hadRole": { "@type": "@id" },
    "prov:atTime": { "@type": "xsd:dateTime"},
    "prov:invalidatedAtTime": { "@type": "xsd:dateTime"},
    "prov:generatedAtTime": { "@type": "xsd:dateTime"},
    "prov:endedAtTime": { "@type": "xsd:dateTime"},
    "prov:startedAtTime": { "@type": "xsd:dateTime"},
    "ical:calscale": { "@type": "xsd:string" },
    "ical:method": { "@type": "xsd:string" },
    "ical:prodid": { "@type": "xsd:string" },
    "ical:version": { "@type": "xsd:string" },
    "ical:location": { "@type": "xsd:string" },
    "ical:resources": { "@type": "xsd:string" },
    "ical:status": { "@type": "xsd:string" },
    "ical:transp": { "@type": "xsd:string" },
    "ical:tzid": { "@type": "xsd:string" },
    "ical:tzname": { "@type": "xsd:string" },
    "ical:tzoffsetfrom": { "@type": "xsd:string" },
    "ical:tzoffsetto": { "@type": "xsd:string" },
    "ical:contact": { "@type": "xsd:string" },
    "ical:relatedTo": { "@type": "xsd:string" },
    "ical:uid": { "@type": "xsd:string" },
    "ical:action": { "@type": "xsd:string" },
    "ical:requestStatus": { "@type": "xsd:string" },
    "ical:exrule": { "@type": "xsd:string" },
    "ical:rrule": { "@type": "xsd:string" },
    "ical:freebusy": { "@type": "xsd:string" },
    "ical:categories": { "@type": "xsd:string" },
    "ical:lastModified": { "@type": "xsd:dateTime" },
    "ical:dtstamp": { "@type": "xsd:dateTime" },
    "ical:created": { "@type": "xsd:dateTime" },
    "ical:exdate": { "@type": "xsd:dateTime" },
    "ical:completed": { "@type": "xsd:dateTime" },
    "ical:dtend": { "@type": "xsd:dateTime" },
    "ical:due": { "@type": "xsd:dateTime" },
    "ical:dtstart": { "@type": "xsd:dateTime" },
    "ical:recurrenceId": { "@type": "xsd:dateTime" },
    "ical:sequence": { "@type": "xsd:integer" },
    "ical:repeat": { "@type": "xsd:integer" },
    "ical:percentComplete": { "@type": "xsd:integer" },
    "ical:priority": { "@type": "xsd:integer" },
    "ical:triggerDate": { "@id": "ical:trigger", "@type": "xsd:dateTime" },
    "ical:triggerDuration": { "@id": "ical:trigger", "@type": "xsd:duration" },
    "ical:duration": { "@type": "xsd:duration" },
    "ical:rdate": { "@id": "ical:rdate", "@type": "xsd:dateTime" },
    "ical:rdatePeriod": { "@id": "ical:rdate", "@type": "xsd:string" },
    "ical:url": { "@type": "@id" },
    "ical:organizer": { "@type": "@id" },
    "ical:attendee": { "@type": "@id" },
    "ical:tzurl": { "@type": "@id" },
    "ical:attach": { "@type": "@id" },
    "ical:class": { "@type": "@id" },
    "ical:geo": { "@container": "@list", "@type": "xsd:float"}
  }
  ]
}