CIFP

From W3C Wiki

Abbreviation for CombinedInverseFunctionalProperty or CompositeInverseFunctionalProperty.

note: there is a concept for this in OWL2: OWL 2 Keys

Where an InverseFunctionalProperty will help you identify something by its relation to another thing, a CombinedInverseFunctionalProperty (CIFP) will help you identify something by a number of relations it may have. This is equivalent to the concept of foreign key in relational databases.

So in foaf the mbox relation is inverse functional. If a Person named `P1` and a Person named `P2` have the same foaf:mbox relation to `<mailto:henry.story@bblfish.net>` then `P1 owl:sameAs P2`.

But we often have things that have their identity dependent on a number of things. So for example a URI's are composed of well known parts


      foo://example.com:8042/over/there?name=ferret#nose
      \_/   \______________/\_________/ \_________/ \__/
       |           |            |            |        |
    scheme     authority       path        query   fragment
       |   _____________________|__
      / \ /                        \
      urn:example:animal:ferret:nose


So to stick with the simpler URN's we could create a vocabular to identify its parts: `uri:scheme` and `uri:path`. This would allow us to say something like


 [] owl:sameAs "urn:example:animal:ferret:nose"^^xsd:anyURI;
    uri:scheme "urn";
    uri:path  "example:animal:ferret:nose".


It is clear in the above example that `uri:scheme` and `uri:path` together identify a URN. That is if we had the following tripples


_:X uri:scheme "urn";
    uri:path   "example:animal:ferret:nose".


Then we should be able to conclude that


_:X owl:sameAs "urn:example:animal:ferret:nose"^^xsd:anyURI.


`uri:scheme` and `uri:path` together (combined) form an Inverse Functional Property.

Now how to model CIFP's is still up for debate. A Number of good suggestions have been put forward on the SWIG mailing list. See the thread http://lists.w3.org/Archives/Public/semantic-web/2005Feb/0095.html which led to a neat definition using N3 rules. This only appears to work in Euler however, so SeanPalmer developed some rules for CIFPs that should work in CWM. See discussion for more details.

They boil down to finding a way to construct a relation out of a number of other relations, and then describing this new relation as an owl:inverseFunctionalProperty

This does some of the work that CurriedFunction have been thought to be good for, but CIFPs are in my opionion easier to understand.