- From: Peter Ansell <ansell.peter@gmail.com>
- Date: Thu, 22 May 2008 07:29:46 +1000
- To: "Johnson, Matthew C. (LNG-HBE)" <Matthew.C.Johnson@lexisnexis.com>
- Cc: semantic-web@w3.org
2008/5/22 Johnson, Matthew C. (LNG-HBE) <Matthew.C.Johnson@lexisnexis.com>:
> Hi,
>
>
>
> I'm slowing soaking in what OWL can and cannot do and after reading the
> "Lessons For Ontology Writers" post [1] by Ian Davis, I thought I'd go ahead
> and ask this capabilities question here.
>
>
>
> In OWL, can you directly define a property that says that something does not
> occur. My current use-case is in determining hyper-linking relationships
> between various publications. The following:
>
>
>
> mysch:Pub a rdfs:Class .
>
> mysch:linksTo a rdf:Property .
>
>
>
> mypubs:p1 a mysch:Pub .
>
> mypubs:p2 a mysch:Pub .
>
> mypubs:p3 a mysch:Pub .
>
>
>
> mypubs:p1 mysch:linksTo mypubs:2 .
>
> mypubs:p3 mysch:linksTo mypubs:2 .
>
>
>
> Lets me say that pub 1 links to pub 2 and that pub 3 links to pub 2.
> However, if I understand the open-world assumption, I cannot assume that pub
> 2 does not link to pub 3. I would need to define something like:
>
>
>
> mysch:notLinksTo a rdf:Property .
>
>
>
> to explicitly state this fact that pub 2 does not link to pub 3.
>
>
>
> My question is whether it is possible in OWL to define a property whose
> range of acceptable instances is the list of instances that do not exist as
> an object in a mysch:linksTo statement (for a given publication)? While
> statically stating that pub 2 does not link to pub 3 is technically possible
> for me, it seems unfortunate. This is because when a new pub comes along
> (e.g. mysch:p4), I then have to update all the statements I've already
> made. This is the part that Ian Davis agreed would cause an explosion of
> triples. I would really like to only state the things that I can
> programmatically find by parsing the raw syntax of a publication (e.g. I can
> find a <a href…> element which provides the mysch:linksTo assertion) and
> would rather the system infer that the lack of a <mysch:linksTo>
> relationship really means a <mysch:notLinksTo>.
>
>
>
> Perhaps the answer is really through SPARQL. I hope I've made my
> question(s) clear. Please let me know if I haven't.
You can use SPARQL to partially derive information about the open
world by using the following construct:
SELECT DISTINCT ?unlinkedDocument1, ?unlinkedDocument2
{
# pick out two publications
?unlinkedDocument1 a mysch:Pub
?unlinkedDocument2 a mysch:Pub
# make them unique
FILTER(?unlinkedDocument1 != ?unlinkedDocument2)
# Introduce a temporary variable in an optional section to determine
whether the pattern exists for either document
OPTIONAL{ ?temporaryDocument1 mysch:linksTo ?unlinkedDocument2
FILTER(?temporaryDocument1 = ?unlinkedDocument1))
OPTIONAL{ ?temporaryDocument2 mysch:linksTo ?unlinkedDocument1
FILTER(?temporaryDocument2 = ?unlinkedDocument2))
# Check off that both of the temporary variables from the OPTIONAL
parts didn't bind, meaning there was no link, and hence including
these two documents in the results as a row where the two fields were
not linked
FILTER(!bound(?temporaryDocument1) && !bound(?temporaryDocument2})
}
That should do what you want. And I know, it looks like magic but it
seems to work. It would create a rather large set of results on any
sufficiently large and sparsely linked set of publications, so running
it may take some time and generate a lot of results!
Hope that helps,
Peter
Received on Wednesday, 21 May 2008 21:30:26 UTC