Redaktor SKOS Vocabulary / describing e.g. attributedTo and location

About the redaktor SkoHub-Vocab
/ repo

We had a short conversation in fedi and @acka47 wrote:

[…] For one, you should define your own namespace e.g. with w3id.org and set up a redirect for the vocab.

Yes, we will do, the static page is just to test. Had already mentioned it in A namespace for things defined in FEPs which might have some unneeded further info.

I am also interested in seeing some example data that shows how the vocab is intended to be used.

In 2 or 3 different ways :wink:

  1. We will use it in the traditional way if an Actor joins a Creative Work project and defines the roles or if such a role is “offered” to an Actor. This is fine. Nothing else needed.

  2. We would like to be able to describe the ActivityPub attributedTo and location in depth without loosing compatibility to existing AP software. This will go to the attributedTo-widget which is used in the different redaktor/widgets for ActivityPub Object types

    So, if you have attributedTo for a low-budget movie like Harold und Maude (1971) - Full Cast & Crew - IMDb then you have 133 actor/role or actor/role/character relations in Cast and Crew.
    But the ActivityPub attributedTo can only have 133 Actor.
    We do not want to duplicate well known Actor and people should always talk about the same “Ruth Gordon” which means we can’t change the type of the (existing) Actor.
    So, if we write something like

{ "attributedTo": [{
    "@context": "https://www.w3.org/ns/activitystreams",
    "summary": "Ruth Gordon plays Maude Chardin in “Harold and Maude (1971)”",
    "id": "http://example.org/relation/123",
    "type": ["Relationship", "Person","Note"],
    "subject": "http://example.org/actor/RuthGordon",
    "relationship": "http://example.org/relationship/leadPerforms",
    "object": {
      "type": ["redaktor:Character", "schema:Person"],
      "name": "Maude",
      "schema:givenName": "Maude",
      "schema:fullName": "Chardin"
    }
  }, ...],
  "context": {"id": "http://example.org/movie/wonderfulMovieId"}
}

then it would be somehow backward compatible.

A cheap software could simply render Note with summary (‘free text’)
Another software could link the Person with the Actor and use summary
While a generic, ActivityPub conformant software would understand Relationship as well and so could link with the Actor and use the label for relationship (or the Roles, e.g. “Hal Ashby ist Regisseur” for Director) e.g. from wikidata in nearly every language of the planet.
And then decide how the object is rendered which is independent and could then e.g. be linked to other movies [bad example here, think e.g. of M or James Bond …]

  1. If anything can be in one place (the SKOS Vocab), then I would like to use it as well to be able to create reverse mappings internally to bridge incoming LD and plain-JSON data as e.g. from imdb or themoviedb …
    This could for example be used to share Link with ActivityPub or for searching Internets.
    Concrete examples:

Alyssa wants to share a Link.
The redaktor mediaproxy will crawl it and directly fill out Alyssa’s post interface with Link+metadata, the infos about the link and really nice previews (node screenshot as fallback).
So the mediaproxy (depending on content-negotiation) transforms the link to ActivityPub markup. But the values come from a lot of different sources …
Let’s say, the proxy sees Content-Type : image/jpeg and goes through the image bit by bit the infos can be metadata which is not Linked Data or e.g. “well formed Adobe XMP” LD …
The mediaproxy can handle all the common media types (audio/ missing yet, coming soon) but also the other ActivityPub types like Article or Page.
If I’d have a reverse mapping saying property director in wikidata expresses Director in the Vocab then it would save me work and further queries.

Alyssa searches for a Movie title to attach/cite/context or announce/offer,rent/etc. the movie.
The starting point might to look if it exists in wikidata e.g. with fedi-mentioned python wikidata suggest and then if it is type Movie to query imdb and themoviedb and what is incoming is plain json then. It would be nice to map all the attribution-things …


Same for location: If I am in my Beethovenstr., Dinslaken Observatory and take a photo of a moon crate, then I could blindly put both location in as:location - but would it help?
I mean, a machine could reason that currently no human with camera or bot-camera is on moon but some are on planet earth including the Observatory and so it might be somehow possible to reason it for a stupid machine but it would be complicated.

With the SkoHub-Vocab you are going into very interesting directions. Though again I wished I had more expertise on the Linked Data stuff and AP extensibility mechanism, as to me this seems to be an inappropriate use of type property:

"type": ["Relationship", "Person","Note"],

The types you specify are related but not similar / overlapping in semantic meaning. You are using it now to express “A Relationship between a Person and a Note”. It looks to me this is just a regular Relationship that expresses “Ruth Gordon lead performs Maude Chardin”.

But that does not fit attributedTo which must be an actor, as you also mention.

Sorry, I don’t have much time to delve more deeply, and these are just some musings of mine. Couldn’t the type be of as:Application as the fallback and specific type of skos:Concept somehow? How does SkoHub do this, and is that conformant to adopted AS/AP practices?

No, sorry. You got it wrong.

attributedTo must not be Actors.
What I meant was that an Actor-type is “given” for this example.
In the example it is the wikidata entry for Ruth Gordon.

The Specs. explicitly say for attributedTo :
“Identifies one or more entities to which this object is attributed. The attributed entities might not be Actors. For instance, an object might be attributed to the completion of another activity.”


You are using it now to express “A Relationship between a Person and a Note”.

The type in ActivityPub do not express any Relationship.
See what JSON-LD @type is.
They say (as in any RDF or Turtle or JSON-LD): This Entity can have the following types …
The types can come from AS Vocabulary (will be supported), schema or another Vocabulary (can be supported) … E.g. Example 103

Or see also Example 8 in AS Core:
“ The Activity Vocabulary defines a range of Object types that are common to many social Web applications. This specification stops short of defining semantically specific properties for most of these objects. External vocabularies can be used to express additional detail not covered by the Activity Vocabulary.”

Let’s please see the relevant pieces in the Specifications …
See Section 4
This image summarizes it:

  1. the type property is not functional. While the Example above shows it, I want to highlight the differences:
    Properties marked as being "Functional" can have only one value. Items not marked as "Functional" can have multiple values.
    In the image you see: id can only have 1 value but type can have multiple.

But that does not fit attributedTo which must be an actor, as you also mention.

An Actor is just a Sub-Property of Object it is not a Core Type !
You can also see this in the image. But it is explicitly specified in the definition for attributedTo above or here :

Actor types are Object types that are capable of performing activities.

Every JSON object in an Activity Streams 2.0 document is either an Object or a Link . All other types defined in the Activity Vocabulary, as well as all extension types, are derived from these two base types.

A JSON object in the Activity Streams 2.0 document is a Link if either: (a) the object contains a type property whose value includes " Link " or (b) any of the types included in the value of the type property are defined as extensions of Link (see Mention for instance); otherwise the JSON object is considered an instance or extension of Object .

So the only things which are given (for a reason) :

  • A type is like a Set or a unique Array.
  • A type can’t have Link and Object at same time cause Link <Disjoint With> Object

Ah, yes you are right on “attributedTo”… I thought there was a restriction for it to refer to an Actor, which there is not.

Other than that I am not disputing that types can have multiple values, and I know Link and Object are disjunct. But the crux in your quote is this part "External vocabularies can be used to express additional detail not covered by the Activity Vocabulary”. We have some examples in the specs, but they hardly offer a comprehensive guide on how we can make extensions in a best-practices manner.

The point I was making that in your type set you combine Objects together in a way that doesn’t provide clarity as to their semantics. In Example 103 we see:

"type": ["Activity", "http://www.verbs.example/Check"],

What can we read from this semantically? Well, it has a ‘base type’ of Activity with an additional custom type extension that effectively makes it a CheckActivity. And that corresponds with what a human reader would get from interpreting the properties. They’d conclude that “Sally checks the flightstatus of Flight1 and finds that it is On Time”.

In your example you have Relationship, Person and Note, three base ActivityStream objects, and if the type property is also an unordered Set, then I don’t know which semantics it expresses. If I look at the properties however I see a regular Relationship expressed.

1 Like

Please also note that I would not need to do crazy things if mastodon would just consume all the types like they were specified :slight_smile:

If I look at the properties however I see a regular Relationship expressed.

And this is what it should be, but no other fedi software would support it then.
The same for Activities in attributedTo

So. Let us put it in an even broader picture.
Just a few implementations make use of attributedTo at the moment …
I think this has very bad implications for users as well as authors of shared creative work.
2 examples,

  1. a photojournalist of the NYT is on a risky assignment and puts his name in the official IPTC/XMP “copyright”-field. It is the only place, where the author specifies it. Then sends the image and goes on with the job.
    The newspaper allows others to share the picture along with a link to the article and the name of the author.
    Only the link is shown.
    What should the user have done in mastodon? Call NYT hotline and describe the picture?
    This (sorry to mention it but it’s reality) has even a serious legal component.

  2. You share the link of a page and it has a nice illustration with cc by sa 4.0 which also requires a neutral attribution. It is in the metadata for the page. But hey, who cares?

Ah, yes you are right on “attributedTo”… I thought there was a restriction for it to refer to an Actor, which there is not.

For me it feels somehow good that there is none.
It encourages a Project and working-together culture instead of a seen-and-announce culture.
Let us stick to the movie example.
“The attributed entities might not be Actors. For instance, an object might be attributed to the completion of another activity.”
Well, we could also build “verbs”/activities from the 2.800 roles in the vocab, but what is the verb for e.g. “Underwater Director of Photography”, so we have still multiple possibilities:

Actions
The Actions which have really different meanings are sioc:hasFunction and redaktor:performs (or leadPerforms, not a must) and sioc:contributes.
sioc:hasFunction is the classical attribution Action.
→ [Alyssa] sioc:hasFunction [Producer].

But then we want to say things, which would make 2 or 3 Actions like
→ [Bob] sioc:hasFunction [Performer].
→ [Bob] sioc:hasFunction [Beaker].
→ [Beaker] sioc:hasFunction [Fictional].

performs or contributes is an attribution Action to say that or what Product was contributed.

But in the database anything becomes a relation anyway, so I wonder if it might be better to express it with an Activity instead a Relation.
But this is would be a question independent from the Vocabulary cause it affects only 3 descriptions of the 2800.

@acka47 Saw your note about putting it in skos:definition as an alternative.
Did the mapping to wikidata today (will push later)
For now I am writing it like so

:n004 a skos:Concept ;
    skos:inScheme :scheme ;
    skos:broader :n00 ;
    skos:exactMatch loc:cph ;
    skos:notation "004" ;
    skos:prefLabel "Copyright Inhaber*in"@de, "Copyright Holder"@en ;
    skos:altLabel "© by"@de, "© by"@en ;
    skos:definition "Eine Person oder Organisation, welcher Urheber- und Rechtsrechte für den geistigen Inhalt eines Werkes gewährt oder übertragen wurden. Der Urheberrechtsinhaber ist zwar nicht unbedingt der Schöpfer des Werks, hat aber in der Regel das ausschließliche Recht, aus dem Verkauf und der Nutzung des Werks, für das der entsprechende Urheberrechtsschutz gilt, finanziell zu profitieren"@de, 
    "A person or organization to whom copy and legal rights have been granted or transferred for the intellectual content of a work. The copyright holder, although not necessarily the creator of the work, usually has the exclusive right to benefit financially from the sale and use of the work to which the associated copyright protection applies"@en ;
    schema:sameAs Property:P3931, tmdb:Copyright%20Holder .

namespaces in the snippet:
schema is schema.org, Property is the namespace for wikidata Property and tmdb for The Movie Database.

But then I can easily write a script (which will also look wikidata for other language labels) to enrich skos:definition

1 Like

Update, found a slide :slight_smile: from the IPTC workshop
New York Times recommends at least for entities to link wikidata entities with
skos:exactMatch