I have a problem with creating universal query for little different owl. I have owl:
((ClassA MyProperty only (ClassX or ClassY)) AND
(ClassA MyProperty exactly 1 ClassX) AND
(ClassA MyProperty exactly 1 ClassY))
and sometimes class has this too (its combination, ClassA can have XY or XZ)
OR
((ClassA MyProperty only (ClassX or ClassZ)) AND
(ClassA MyProperty exactly 1 ClassX) AND
(ClassA MyProperty exactly 1 ClassZ))
full owl:
<owl:Class rdf:about="ClassA">
<rdfs:subClassOf>
<owl:Class>
<owl:unionOf rdf:parseType="Collection">
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<owl:Restriction>
<owl:onProperty rdf:resource="MyProperty"/>
<owl:allValuesFrom>
<owl:Class>
<owl:unionOf rdf:parseType="Collection">
<rdf:Description rdf:about="ClassX"/>
<rdf:Description rdf:about="ClassY"/>
</owl:unionOf>
</owl:Class>
</owl:allValuesFrom>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty rdf:resource="MyProperty"/>
<owl:onClass rdf:resource="ClassX"/>
<owl:qualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:qualifiedCardinality>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty rdf:resource="MyProperty"/>
<owl:onClass rdf:resource="ClassY"/>
<owl:qualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:qualifiedCardinality>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<owl:Restriction>
<owl:onProperty rdf:resource="MyProperty"/>
<owl:allValuesFrom>
<owl:Class>
<owl:unionOf rdf:parseType="Collection">
<rdf:Description rdf:about="ClassX"/>
<rdf:Description rdf:about="ClassZ"/>
</owl:unionOf>
</owl:Class>
</owl:allValuesFrom>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty rdf:resource="MyProperty"/>
<owl:onClass rdf:resource="ClassX"/>
<owl:qualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:qualifiedCardinality>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty rdf:resource="MyProperty"/>
<owl:onClass rdf:resource="ClassZ"/>
<owl:qualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:qualifiedCardinality>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</owl:unionOf>
</owl:Class>
</rdfs:subClassOf>
</owl:Class>
The problem is, that I dont know which class has only one combination and which one has more than one.
Query for single sources:
PREFIX my: <http://www.semanticweb.org/MyOnto#>
SELECT ?myClass ?prop (str(?numInt) as ?number) ?source
WHERE {
?myClass rdfs:subClassOf my:Classes ;
rdfs:subClassOf ?x .
?x owl:intersectionOf ?array.
?array rdf:rest*/rdf:first ?triples.
?triples owl:onProperty ?prop ;
owl:onClass ?source;
owl:qualifiedCardinality ?numInt.
?source rdfs:subClassOf my:Sources .
}
Query works with intersection in top, but in case I have 2 or more combination, its wrapped in union of this concepts. So its easy to wrap query too and I get result for combination, but than I dont get result for single use. So the Q is, how to write universal query that work with e.g. only ClassA and MyProperty or ... THX