Comments on SPARQL 1.1 Property Paths

I had a few questions/comments regarding the draft of the SPARQL 1.1 Property Paths that was just published.

Has there been any consideration of enabling, for lack of a better term, negated properties in property paths?  By negated properties, I mean the notion of "any property EXCEPTING x".  The use case that comes to mind is the notion of determining if two entities are connected via some graph pattern, without having to know how they are connected and wanting to ignore trivial / useless connections.   For instance, I might want to discover whether or not ex:GeorgeWBush and ex:TonyBlair have a connection in the graph, ignoring the fact that they are both (rdf:type ex:Politician)s. 

It seems that having a negation mechanism might be more efficient, in certain cases, than a long listing of alternatives. 

Consider:

{ 
 ?x ( foaf:knows | ex:meetOnce | ex:workedWith | ex:ownedCompany | ex:employed | .. )* ?y .
}

as compared to:

{
 ?x  !( rdf:type | ^rdf:type)* ?y .
}

Note:  Here the "!" character is meant to convey a path that exists but does not include these properties, as opposed to implying the absence of a path using those properties.  

I realize that with clever ontology-wrangling, one could make all "interesting" properties a sub-property of a utility property that would serve to make property path querying easier, but that seems less elegant and, in some situations, impractical.

Somewhat related question:  I think I understand why the WG doesn't want to tackle variable property paths, but might it be useful to include a mechanism for general property description, without explicit property naming?  One wouldn't need the chosen property for the path returned just be able to ontologically-describe an appropriate property to chose when considering paths.

For instance, imagine trying to ensure, without exhaustive specification, that all property paths identified only occur through non-literal objects, so as to avoid trivial connections (say ex:first_name or ex:age).

It might look something like:

{
  ?x  ( [ a owl:ObjectProperty ] | ^[ a owl:ObjectProperty ] ) * ?y .
}

Thanks for listening,
Doug.

Received on Monday, 1 February 2010 02:43:24 UTC