The following probably isn't even syntaxtically worthy. I fiddled around for a few yours converting the 02 draft RFC into this. I took all kinds of amusing short cuts. But I found it an interesting exercise and others may find it marginally interesting. Feel free to evolve, mutate, whatever! - BenHyde
#### A very rough rdf-schema of RDF vocabulary for atom ### This is based, sometimes quite recreationally upon these vocabularies. @prefix : <http://www.w3.org/2000/02/rdf-schema#>. @prefix dc: <http:://url.org/dc/elements/1.1/>. @prefix foaf: <http:://xmlns.com/faof/0.1/>. @prefix owl: <http://www.w3.org/2002/07/owl#>. @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix vs: <http://www.w3.org/2003/06/sw-vocab-status/ns#>. @prefix wot: <http://xmlns.com/wot/0.1/>. @prefix wn: <http://xmlns.com/wordnet/1.6/Document/>. @prefix hmm: <http://example.com/bogus/stuff/tbd/>. #### We define the vocabulary as an ontology in OWL. atom: a owl:Ontology ; dc:date "2004/10/11 19:37:00" ; dc:description "The Atom Syndication RDF vocabulary" ; dc:title "The Atom Syndication RDF vocabulary" ; hmm:comment "I wonder how I declare the mime type of the enclosing doc?"; wot:assurance hmm:assurance ; wot:src_assurance hmm:assurance2 ; :seeAlso <http://www.intertwingly.net/wiki/pie/FrontPage>; :seeAlso <http://www.ietf.org/internet-drafts/draft-ietf-atompub-format-02.txt>. #### Clases for Mixing In atom:literal a :class ; :comment "A mixin used on all atom literals." :isDefinedBy atom:; vs:term_status "testing". atom:element a :class ; :comment "A mixin used on all atom classes." :isDefinedBy atom:; vs:term_status "testing" . atom:document a :Class; :comment "A mixin used on the two atom classes that can be documents."; :subClassOf wn:Document, atom:element. atom:top-level-element a :class; :comment "atom:head and atom:entity have some attribute inheritence action going on."; :subClassOf atom:element; atom:title a rdf:property; :domain atom:top-level-element; :range atom:title; :disjoint atom:simple-title; hmm:min 1; hmm:max 1. atom:mode a ref:property; :comment "Indicates method used to encode the content, default xml." :domain atom:content; :range atom:mode-literal; hmm:default "xml"; hmm:max 1; atom:link a rdf:property; :comment "Conveys a URI associated with the feed." hmm:constrant "The set of alternate links but not have overlapping type." hmm:constrant "Links on atom:header that resolve to resources of type 'text/html' must have an autodiscover back link to the enclosing atom:feed" hmm:min 1; :domain atom:top-level-element; :range atom:alternate-link. atom:author a rdf:property; :comment "The agent that authored this." hmm:constrant "either appears, or all entities have one" hmm:inheritance "sets default for elements, which they may override." :domain atom:top-level-element; :range atom:person; hmm:max 1. atom:contributor a rdf:property; :comment "Contributors to the feed." :domain atom:top-level-element; :range atom:person. atom:id a rdf:property; :comment "A permanent, universally unique identifier for the feed." :domain atom:top-level-element; :range atom:identity; :seeAlso <http://www.ietf.org/internet-drafts/draft-kindberg-tag-uri-05.txt>; hmm:max 1; atom:copyright a rdf:property; :comment "Human-readable copyright statement for feed. Not machine-readable." :domain atom:top-level-element; :range atom:content; hmm:inheritance "sets default for elements, which they may override." hmm:max 1; xml:lang a rdf:property; :comment "All classes may have an xml:lang to override the default language."; hmm:comment "How do I spec defaulting/inheritance?"; :isDefinedBy atom: ; :label "lang" ; :domain atom:element. #### Now the literal classes. atom:version a :class; :comment "the version of the feed"; :subClassOf atom:literal; hmm:constant "draft-ietf-atompub-format-02: do not deploy"; atom:mode-literal a :class; :comment "Kinds of content encoding."; hmm:comment "how do I declare an enumeration?"; hmm:comment "'xml' 'escaped', and 'base64'"; :subClassOf atom:literal. atom:name a class; :comment "Human-readable non-unique name."; :subClassOf foaf:name. atom:uri a class; :comment "An RFC2396 URI that has been xml:base processed." :seeAlso "...W3C.REC-xmlbase-20010627"; :seeAlso "http://.../RFC2396"; :subClassOf hmm:uri, foaf:homepage, atom:literal; atom:identity a :class; :comment "An very constrained subclass of atom:uri." :comment "The Atom RFC has extensive details on this." :subClassOf atom:uri; atom:email a class; :comment "A RFC2822 email adress"; :subClassof foaf:mbox, atom:literal; atom:simple-title a :class; :comment "A human-readable title." :subClassOf dc:title, atom:literal; atom:relation a class; :comment "Value drawn from those given in Atom protocol."; hmm:comment "What's that mean?"; :subClassof atom:literal, hmm:do_better. atom:media-type a class; :comment "An RFC2045 media type.". :subClass of atom:literal, hmm:do_better. atom:date a class; :comment "A RFC3339 date"; :subClassof atom:text-literal. atom:language a :class; :comment "An RFC3066 language tag"; :subClassof atom:literal; ### Now the classes that actually get instantiated. atom:feed a :class; :comment "A set of entries generated from a single source." :subClassOf atom:document, atom:top-level-element; vs:term_status "unstable"; :label "feed". atom:head a rdf:property; :comment "Clump feed's the metadata into a header." :domain atom:feed; :range atom:head; hmm:min 1; hmm:max 1. atom:entries a rdf:property; :domain atom:feed; :range atom:entry . atom:version a rdf:property; :comment "TBD"; :domain atom:feed; :range hmm:tbd; hmm:min 1; hmm:max 1; atom:head a :class; :subClassOf atom:top-level-element :comment "Analagous to an email or HTML header." hmm:maybe-extended "yes". atom:tagline a rdf:property :comment "Human-readable description or tagline for the feed"; :domain atom:head; :range atom:content hmm:max 1 . atom:generator a rdf:property; :comment "For debuggin and other purposes the agent that generated the feed."; :domain atom:head; :range atom:generator; hmm:inheritance "who knows?" :max 1; atom:info a rdf:property; :comment "A human-readable explanation of the feed format itself." :comment "Intended audience is publishers, not processors." hmm:comment "feed format?" :domain atom:head; :range atom:content; hmm:max 1. atom:modified a rdf:property; :comment "A date indicating the time the state of the feed was last modified, including changes to entries therein."; hmm:constrant "date's timezone SHOULD appear, and MUST be UTC"; :domain atom:head; :range atom:date; hmm:min 1; hmm:max 1. atom:entry a :class; :comment "A single entry generated from the feed source." :subClassOf atom:document; vs:term_status "unstable"; hmm:maybe-extended "yes"; :label "entity". atom:version a rdf:property; :comment "A version is MUST appear on an atom:entry when it is an atom:document."; :domain atom:entry. atom:updated a rdf:property; :comment "Indicates the most recent instant when a change was made that the publisher wishes to bring to the attention of subscribers." hmm:comment "Since the instant maybe in the future it shouldn't say 'most recent'." :comment "Publishers MAY change the value over time."; :comment "Processors MAY sorts entries based on this value."; :comment "Processors MAY embargo entries prior to this instant."; :domain atom:entry; :range atom:date; hmm:min 1; hmm:max 1. atom:summary a rdf:property; :comment "Contains a short summary, abstract, or excerpt of the entry." :domain atom:entry; :range atom:content; hmm:max 1; hmm:comment "Multiple summaries, say for different audiences, are not allowed.". atom:content a rdf:property; :comment "Conveys the content of the entry." :domain atom:entry; :range atom:content; hmm:min 1; hmm:constraint "content of type multipart/alternative may appear only at top level."; hmm:constraint "content of type multipart/alternative must have contain at least on alternative"; hmm:consumer-constraint "You SHOULD, present the best alternative."; hmm:consumer-constraint "You SHOULD,Present only one alternative.". atom:content a rdf:property; :comment "The where the entry was first published." :comment "This maybe but is not required to resolve to an atom:feed." :domain atom:entry; :range atom:uri, atom:identifier; hmm:max 1. atom:person a :class ; :comment "Describes a person, corporation, or similar entity." hmm:comment "person? - agent!"; hmm:maybe-extended "true"; :subClassOf foaf:agent . atom:name a rdf:property; :domain atom:person; :range atom:name. atom:name a rdf:property; :domain atom:person; :range atom:uri. atom:name a rdf:property; :domain atom:person; :range atom:email. atom:generator a :class; :comment "Description of the generating agent." atom:content a ref:property :comment "Human-readable name for generating agent." :domain atom:generator :range atom:text-literal; atom:uri a :rdf:property; :comment "The associated resource must be relevant to this agent." :domain atom:generator; :range atom:uri :max 1; atom:version a rdf:property; :domain atom:generator; :range atom:simple-text; atom:link a class; :comment "Analagous to the link found in HTML heads."; hm:comment "How do I say \"Must not have child content\""; hm:comment "Surely this must be defined in some other vocabulary."; :subClassof atom:element. atom:rel a rdf:property; :domain atom:link; :comment "How the linked resource relates to the enclosing element." :range atom:relation; hmm:min 1; hmm:max 1; atom:type a rdf:property; :domain atom:link; :comment "A hint as to the media type of the link." :range atom:media-type; hmm:min 1; hmm:max 1; atom:href a rdf:property; :domain atom:link; :comment "The URI of the link." :range atom:uri; hmm:min 1; hmm:max 1. atom:hreflang a rdf:property; :domain atom:link; :comment "Hint reguarding language of linked resource." :comment "The link denotes a translated version of the linked resource into this langauge when the link's rel is 'alternate'." :range atom:language; hmm:max 1; atom:title a rdf:property; :domain atom:link; :range atom:simple-title; hmm:max 1; atom:title a :class :disjoint atom:simple-title; :subClassOf atom:content; atom:content a :class ; :comment "Atom Content is analagous to the multipart structure of mimi encoded email.";