Making statements about statements which are no reified

814 views Asked by At

Forgive me if I'm misusing some terms, I'm just becoming familiar with RDF and reification in particular.

What I'm trying to understand is if/how you can make a statement about a statement that you don't control and which isn't actually set up as an rdf:Statement (or any other resource, i.e., reified).

For instance, if some semantic website makes the claim:

ex:elvis-presley
    ex:is-alive "true"^^xsd:boolean .

There is an implicit rdf:Statement resource here:

_:x
    a rdf:Statement ;
    rdf:subject ex:elvis-presley ;
    rdf:predicate ex:is-alive ;
    rdf:object ex:true "true"^^xsd:boolean .

Now suppose I have my own semantic website and I would like to refute this statement, or affirm it, or make any other kind of meta-statement about this statement. The statement resource doesn't have a global identifier, so I can't reference it.

Is there any way to handle this, or can you only make statements about statements that are explicitly formed as identified resources in their own right?

2

There are 2 answers

9
Joshua Taylor On BEST ANSWER

I think that reification is a topic that initially seems more useful than it actually tends to be in practice. You can have a triple in a graph:

s p o .

and you can have four triples in a graph:

x a rdf:Statement .
x rdf:subject s .
x rdf:preficate p .
x rdf:object o .

but that's about it. If someone happens to have four triples of the second form, and x happens to be a URI, then then you write triples about x. If it's a blank node, then you don't have a way of referencing it. In either case, x is said to be a reification of the triple s p o. That means that the question

Can you only reify statements that are explicitly formed as identified resources in their own right?

doesn't make a whole lot of sense. The reificiation of a statement s p o is a resource x that has the associated properties. "To reify s p o" doesn't really mean anything except "pick an x, and assert the corresponding triples about it."

It's very unlikely that anyone trying to assert s p o would write the second form. The second form tends to arise if you're trying to represent some statements about triples, e.g., "john says x . x a rdf:Statement . …".

If you want to decry someone's claim that Elvis lives, you'd probably just do

:elvisLives a rdf:Statement ;
            rdf:subject ex:elvis-presley ;
            rdf:predicate ex:is-alive ;
            rdf:object true ;
            :claimedBy <http://example.org/whoeverSaidIt> ;
            :hasValue false .

Alternatively, if you're in the realm of OWL, you can use a negative property assertion:

NegativeDataPropertyAssertion( ex:lives ex:elvis-presley "true"^^xsd:boolean )

The RDF representation would look like

_:x rdf:type owl:NegativePropertyAssertion .
_:x owl:sourceIndividual ex:elvis-presley .
_:x owl:assertionProperty ex:lives .
_:x owl:targetValue true .

You can see a similarity between the two approaches. OWL includes a sort of reification vocabulary with its owl:sourceIndividual, owl:assertionProperty and owl:targetValue.

1
Vinh Nguyen On

The newly proposed approach called singleton property is exactly what you need. This approach is formally described in this paper "Don’t like RDF Reification? Making Statements about Statements Using Singleton Property". http://www.slideshare.net/ntkimvinh7/www2014-singleton-propertyfinal

In your example, instead of using reification, the triple can be represented using the singleton property approach, such as

ex:elvis-presley ex:is-alive#1 "true"^^xsd:boolean .

ex:is-alive#1 rdf:singletonPropertyOf ex:is-alive .

If you want to dispute this fact, you can use the singleton property ex:is-alive#1 because it can be globally unique if you use a UUID, instead of #1.