There have been some discussions about vocabularies in the Gitter channels the past few hours. So I thought I would jot some of my thoughts down in the forum.
For interoperability we need to re-use data shapes or at the very least resolve them through some sort of equivalence process. To illustrate, I will use one of my bookmarks that was created with the Markbook application. Here it is:
@prefix : <#>.
@prefix terms: <http://purl.org/dc/terms/>.
@prefix bookm: <http://www.w3.org/2002/01/bookmark#>.
@prefix XML: <http://www.w3.org/2001/XMLSchema#>.
@prefix n0: <http://xmlns.com/foaf/0.1/>.
@prefix c: </profile/card#>.
<#0.08765609738909719>
a bookm:Bookmark;
terms:created "2019-02-12T07:32:50.643Z"^^XML:dateTime;
terms:title "Style sheets in code";
bookm:recalls n1:constructable-stylesheets;
n0:maker c:me.
I first noticed that it suggested that it was a bookm:Bookmark
, yet the example Bookmark used different properties other than bookm:recalls
. So I decided to describe it from scratch in SHACL.
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix sol: <http://solid.org/shapes/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix terms: <http://purl.org/dc/terms/>.
@prefix XML: <http://www.w3.org/2001/XMLSchema#>.
@prefix bookm: <http://www.w3.org/2002/01/bookmark#>.
sol:BookmarkShape
rdf:type rdfs:Class;
rdf:type sh:NodeShape;
rdfs:comment "A bookmark refering to a website."^^rdf:HTML;
rdfs:label "Bookmark";
sh:targetClass sol:Bookmark;
owl:equivalentClass <http://www.w3.org/2002/01/bookmark#Bookmark>;
sh:property [
sh:path foaf:maker;
sh:description "Person creating the bookmark";
sh:name "Created By";
sh:nodeKind sh:IRI;
];
sh:property [
sh:path terms:created;
sh:name "Date Created";
sh:description "The date the bookmark was created";
sh:datatype XML:dateTime;
];
sh:property [
sh:path terms:title;
sh:name "Title";
sh:description "The title of the bookmark";
sh:datatype xsd:string;
];
sh:property [
sh:path bookm:recalls;
sh:name "Web Site";
sh:description "The URL of the web site";
sh:nodeKind sh:IRI;
].
The example bookmark would not validate against this shape and needed to have the type set to a sol:Bookmark
where the prefix sol is @prefix sol: <http://solid.org/shapes/> .
I feel this is more accurate than a bookm:Bookmark
as it contains the wider range of properties.
But it also highlights that just knowing the vocab is not sufficient for inter-operability. Rather we should also publish the data shape so that we can have apps decide how to cater for differences between the shapes in different apps.
Further, to facilitate a ‘follow your nose’ approach, I think we need to decide on a standard way of discovering the data shape. In this case, for example, we could include it in the typeIndex. So you could go from settings–>prefs–>public typeIndex–>Bookmark where you find a triple to lets you know which data shape has been used.
I also feel, we should curate common data shapes in the same way that schema.org curates them for json-ld.
I am interested in any feedback you care to give.