- From: Jesse Weaver <weavej3@rpi.edu>
- Date: Tue, 19 Jun 2012 11:39:45 -0400
- To: public-vocabs@w3.org
Hi Dan.
Someone pointed me to your email on this mailing list, and it seems
like I can be of help. Sorry for the late response. For a quick
answer to your question about finding OGP/Facebook-related schema,
skip to the end of this email and read the conclusion. Everything in
between is explanation and details.
What I want to say in this email is that there are three different
things in the overlap of Facebook and RDF: the Open Graph Protocol,
the Custom Open Graph, and the Graph API. These three things are not
the same. Often, people mistakenly refer to all RDF stuff related to
Facebook as the Open Graph Protocol. Below is a description of how
these three things relate to RDF, and how their RDF can be found.
=== OPEN GRAPH PROTOCOL (OGP) ===
At http://ogp.me/ns (when requesting text/turtle or application/rdf
+xml), you are served up one of the ogp.me.* files found at https://github.com/facebook/open-graph-protocol/tree/master/ns
. These files contain the stand-alone, highest-level parts of the
OGP schema (or ontology, whichever you want to call it). Most RDFers
are sufficiently familiar with this.
=== CUSTOM OPEN GRAPH (COG) ===
Then, there is something called Custom Open Graph (COG), which is an
extension of OGP by Facebook. From a strict RDF standpoint, this
contributes more specific properties for use in meta tags, all which
are listed here: https://developers.facebook.com/docs/opengraph/objects/builtin/
. The terminology is a bit confusing for RDFers, though. For
example, there is a book "object" type with associated properties
book:release_date, book:author, book:isbn, and book:tag. However, the
meta tags used for describing a book result in RDF triples like:
@prefix book: <http://ogp.me/ns/book#> .
@prefix og: <http://ogp.me/ns#> .
<> og:type "book" ;
book:release_date "2012-06-19" ;
book:author "John Doe" .
In other words, although we are talking about a book, there is not
rdf:type triple saying that it is a book, nor is there any URI
representing the concept of a book. Instead, og:type is used to
specify a literal which indicates the instance type. However, if you
ask for text/turtle from a COG namespace, e.g., http://ogp.me/ns/
book , you will be 302 redirected to http://graph.facebook.com/schema/og/book
. Here you will find basic specifications of the book properties,
as well as a URI for the book class. (Also included are the basic OGP
URIs.) Here is the book-specific portion of the document (with common
prefix declarations implied):
@prefix api-book: <http://graph.facebook.com/schema/opengraphobject/book#
> .
@prefix book: <http://ogp.me/ns/book#> .
@prefix opengraphobject: <http://graph.facebook.com/schema/opengraphobject#
> .
opengraphobject:type a rdfs:Class ;
rdfs:label "opengraphobject" .
api-book:book a rdfs:Class ;
rdfs:label "book" ;
rdfs:subClassOf opengraphobject:type .
book:author a rdf:Property ;
rdfs:label "author" .
book:isbn a rdf:Property ;
rdfs:label "isbn" .
book:release_date a rdf:Property ;
rdfs:label "release_date" .
book:tag a rdf:Property ;
rdfs:label "tag" .
The class api-book:book is not really documented anywhere except here,
and it was created with RDFers in mind. Although not mentioned here,
it could be said that
api-book:book owl:equivalentClass [ a owl:Restriction; owl:onProperty
og:type; owl:hasValue "book" . ] .
book:author rdfs:domain api-book:book .
book:isbn rdfs:domain api-book:book .
book:release_date rdfs:domain api-book:book .
book:tag rdfs:domain api-book:book .
In hindsight, I wish I had included such triples since they make
explicit the relationship of the class URI with what actually appears
in the meta tags (RDFa).
(Just FYI, note that http://ogp.me/ns/article is currently broken.)
So far, I have talked about so-called "built-in objects." These are
the things in COG that are directly supported by Facebook. However,
Facebook apps can also define their own objects (see https://developers.facebook.com/docs/opengraph/define-objects/
). I will not venture to discuss that here, primarily because I
can't find an example app with which to make illustrations.
=== GRAPH API ===
Now you did not seem to ask about the Graph API, but since people
commonly conflate OGP and the Graph API (or at least, the RDF served
from it), I cannot be certain that it is not related to your question.
It is important to understand the distinction between OGP and the
Graph API. OGP is a standard way of describing pages on the web so
that they can be integrated into Facebook's social graph. Note,
however, that Facebook's social graph contains things that are
strictly internal. Access to these things (respecting permissions) is
provided via the Graph API.
Traditionally, the Graph API provided only JSON, but as of September
2011, it also provides Turtle in which the HTTP(S) URIs are
dereferenceable. Some of the classes are documented at https://developers.facebook.com/docs/reference/api/
, but without mention of RDF. However, the convention for finding
the RDF is simple. For class <classname>, relevant data can be found
at http://graph.facebook.com/schema/<classname> . For example, here
is a portion of the schema for the user class (with common prefix
declarations implied):
@prefix : <http://graph.facebook.com/schema/~/> .
@prefix user: <http://graph.facebook.com/schema/user#> .
user:type a rdfs:Class ;
rdfs:label "user" .
user:id a owl:DatatypeProperty ;
a owl:InverseFunctionalProperty ;
rdfs:label "id" ;
rdfs:comment "The user's Facebook ID. No `access_token`
required. `string`." ;
rdfs:domain user:type ;
rdfs:range xsd:string ;
rdfs:subPropertyOf :id .
user:name a rdf:Property ;
rdfs:label "name" ;
rdfs:comment "The user's full name. No `access_token` required.
`string`." ;
rdfs:domain user:type ;
rdfs:subPropertyOf :name .
user:friends a owl:ObjectProperty ;
rdfs:label "friends" ;
rdfs:comment "The user's wall." ;
rdfs:domain user:type ;
rdfs:subPropertyOf :feed .
=== CONCLUSION ===
In short, be sure not to confuse the OGP, the COG, and the Graph API.
This is hard not to do since COG is an extension of the OGP for which
dereferencing of URIs is supported by the Graph API. The three are
related, but not the same.
To find schema for OGP, ask for application/rdf+xml or text/turtle
from http://ogp.me/ns .
To find schema for a COG object type <typename>, ask for text/turtle
from http://ogp.me/ns/<typename> . A list of built-in (i.e., Facebook-
supported) COG object types can be found at https://developers.facebook.com/docs/opengraph/objects/builtin/
.
To find schema for internal Facebook type <typename>, ask for text/
turtle from http://graph.facebook.com/schema/<typename> . A list of
internal Facebook types can be found at https://developers.facebook.com/docs/reference/api/
.
I hope this was helpful.
Jesse Weaver
Ph.D. Student, Patroon Fellow
Tetherless World Constellation
Rensselaer Polytechnic Institute
http://www.cs.rpi.edu/~weavej3/index.xhtml
Received on Tuesday, 19 June 2012 15:40:48 UTC