To be clear this is only about a particular way of writing rdf: namely RDF/XML. Other syntaxes don't feature these differences.
With that disclaimer out of the way:
What we're trying to do is write statements of the form:
subject predicate object
and in particular:
subjectURI predicate objectURI
So how do we introduce subject and object URIs in RDF/XML?
rdf:about
sets the subject URI of a statement, which may be absolute (http://example.com/
) or resolved relative to the BASE of the document (e.g. /foo/bar
, #frag
). (Like href
in html)
rdf:resource
sets the object URI of a statement, once again either absolute or relative.
rdf:ID
sets the subject URI, but it can only be within this document. An ID can also only be used once. Very like <a name="baz">
or id="baz"
in html.
rdf:ID
is discouraged since
- you can replace it with an
rdf:about
or rdf:resource
with a fragment #baz
and
- it can cause xml issues if you use the same id more than once.
That is, it's redundant and a potential source of errors.
In retrospect there typically only needs to be one attribute to specify a URI, since whether something is a subject or object is apparent from the RDF/XML syntax:
<ex:Foo ...> - subject
<ex:prop ... /> - property then object
</ex:Foo>
<ex:Foo ...> - subject
<ex:prop> - property
<ex:Bar ... /> - subject (and implictly an object chaining from previous)
...
(rule of thumb: odd lines rdf:about
, even lines, rdf:resource
)
and using both rdf:about
and rdf:resource
on an element is almost always an error (you're either in a subject position or object position).
tl;dr
Avoid rdf:ID
. Use rdf:about
and rdf:resource
much like an href, the former for subject, the latter for objects.
Additional
Forgot to mention that rdf:ID
can be used on a property element, but it does something you may find unexpected: it reifies the triple. Avoid rdf:ID
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…