#Below are SPARQL update operations that further define some of the types
# declared or defined in the Turtle file displayed by
# http://www.webkb.org/kb/it/p_kEvaluation/ontology/sub/sub.ttl.html
# Since this referred Turtle file uses types that are further defined below,
# the parsing of the Turtle file shouldbe followed by the execution of the
# SPARQL update operations below.
#This file reuses the sections of Sections 1 of the Turtle file
# (in order to ease the reader's comparison between the two files)
# and sub-divides some of them. The symmetry between the divisions of
# Section 1.2.1 and those of Section 1.3.1 is intensional.
# Here is the Table of Content :
# 1. Basic Types
# 1.1. Some Top-Level Basic Relation Types //empty in this file
# 1.2. Generalization, Specialization, Comparability And Definitions
# 1.2.1. Strict Generalization And Specialization
# 1.2.1.1. sub:sC (strict subClass uncomparable but not disjoint to its siblings
# except for those which are connected by disjointWith relations)
# 1.2.1.2. sub:sP (counterpart of sub:SC for properties)
# 1.2.1.3. sub:pP (partition of properties)
# 1.2.1.4. sub:eC (sub:exclusive_strict_subClasses), sub:eP (idem but for properties)
# 1.2.1.5. sub:uoP (union of properties) and sub:cP (as sub:cC but for properties)
# 1.2.1.6. sub:neCs (non-equivalent nor exclusive classes), nePs
# 1.3. Parts, Members and Their Inverses
# 1.3.1. Strict Parts/Members and Their Inverses
# 1.3.1.1. sub:sPart, counterpart of sC and sP for parts (from individuals)
# 1.3.1.2. sub:c_partOf, sub:c_part, sub:c_sPart
# (counterparts of sub:partOf, sub:part and sub:sPart, but from types)
# 1.3.1.3. sub:pParts, sub:c_pParts (part partitions for individuals/types)
# 1.3.1.4. sub:eParts, sub:c_eParts
# 1.3.1.5. sub:cParts, sub:c_cParts
# 1.4. Contextualizing Or Negating Relations
#The order of the SPARQL update operations below is important:
# if an operation reuses another (hence expands into another),
# it must be placed before it to be executed before it.
BASE <http://www.webkb.org/kb/it/p_kEvaluation/ontology/sub/>
PREFIX sub: <http://www.webkb.org/kb/it/p_kEvaluation/ontology/sub/> .
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
PREFIX owl: <http://www.w3.org/2006/12/owl2#> .
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> .
#@@@@@@@@@@@@@@@@@@@@@@@@ 1. Basic Types
#*********************** 1.1. Some Top-Level Basic Relation Types
#************************ 1.2. Generalization, Specialization, Comparability And Definitions
#======================== 1.2.1. Strict Generalization And Specialization
#------------------------ 1.2.1.1. sub:sC (strict subClass uncomparable but not disjoint to its
# siblings except for those which are connected by disjointWith relations)
# cf. http://www.webkb.org/kb/it/o_KR/p_kEvaluation/o_completeness/#SomeUsefulSubtypeProperties
#First, sub:sC_ (since it is given in the article)
DELETE { ?class sub:sC_ ?subC1, ?subC2 }
INSERT{ ?class sub:proper-superClassOf ?subC1, ?subC2 .
?subC1 sub:uncomparable-but-not-disjoint_class ?subC2 }
WHERE { ?class sub:sC_ ?subC1, ?subC2 . #for any two subclasses ?subC1 and ?subC2
FILTER(?subC1 != ?subC2) };
#Now, sub:sC
#1) the case that implies sub:sC (i.e. when ?subC1 is not comparable/exclusive to ?subC2):
DELETE { ?class sub:sC ?subC1, ?subC2 }
INSERT{ ?class sub:proper-superClassOf ?subC1, ?subC2 .
?subC1 sub:uncomparable-but-not-disjoint_class ?subC2 }
WHERE { ?class sub:sC ?subC1, ?subC2 . #for any two subclasses ?subC1 and ?subC2
FILTER(?subC1 != ?subC2)
FILTER NOT EXISTS{ ?subC1 rdfs:subClassOf|owl:equivalentClass|owl:sameAs ?subC2 }
FILTER NOT EXISTS{ ?subC1 ^rdfs:subClassOf|owl:disjointWith ?subC2 }
};
#2) the case where ?subC1 is comparable to ?subC2:
DELETE { ?class sub:sC ?subC1, ?subC2 }
INSERT{ ?class sub:proper-superClassOf ?subC1, ?subC2 }
WHERE { ?class sub:sC ?subC1, ?subC2 . #for any two subclasses ?subC1 and ?subC2
FILTER(?subC1 != ?subC2)
FILTER EXISTS{ ?subC1
rdfs:subClassOf|^rdfs:subClassOf|owl:equivalentClass|owl:sameAs ?subC2 }
};
#3) the case where ?subC1 is exclusive to ?subC2:
DELETE { ?class sub:sC ?subC1, ?subC2 }
INSERT{ ?class sub:proper-superClassOf ?subC1, ?subC2 }
WHERE { ?class sub:sC ?subC1, ?subC2 . #for any two subclasses ?subC1 and ?subC2
FILTER EXISTS{ ?subC1 owl:disjointWith ?subC2 }
};
#------------------------ 1.2.1.2. sub:sP (counterpart of sub:SC for properties)
#1) the case that implies sub:sP (i.e. when ?subP1 is not comparable/exclusive to ?subP2):
DELETE { ?prop sub:sP ?subP1, ?subP2 }
INSERT{ ?prop sub:proper-superPropertyOf ?subP1, ?subP2 .
?subP1 sub:uncomparable-but-not-disjoint_pr ?subP2 }
WHERE { ?prop sub:sP ?subP1, ?subP2 . #for any two subproperties ?subP1 and ?subP2
FILTER(?subP1 != ?subP2)
FILTER NOT EXISTS{ ?subP1 rdfs:subPropertyOf|owl:equivalentProperty|owl:sameAs ?subP2 }
FILTER NOT EXISTS{ ?subP1 ^rdfs:subPrOf|owl:disjointProperty ?subP2 }
};
#2) the case where ?subP1 is comparable to ?subP2:
DELETE { ?prop sub:sP ?subP1, ?subP2 }
INSERT{ ?prop sub:proper-superPropertyOf ?subP1, ?subP2 }
WHERE { ?prop sub:sP ?subP1, ?subP2 . #for any two subproperties ?subP1 and ?subP2
FILTER(?subP1 != ?subP2)
FILTER EXISTS{ ?subP1
rdfs:subPropertyOf|^rdfs:subPropertyOf|owl:equivalentProperty|owl:sameAs ?subP2 }
};
#3) the case where ?subP1 is exclusive to ?subP2:
DELETE { ?prop sub:sP ?subP1, ?subP2 }
INSERT{ ?prop sub:proper-superPropertyOf ?subP1, ?subP2 }
WHERE { ?prop sub:sP ?subP1, ?subP2 . #for any two subproperties ?subP1 and ?subP2
FILTER EXISTS{ ?subP1 owl:disjointProperty ?subP2 }
};
#------------------------ 1.2.1.3. sub:pP (partition of properties: disjointUnionOfProperties);
# counterpart of sub:pC (owl:unionDisjointOf)
DELETE { ?prop sub:pP (?p1 ?p2) }
INSERT{ ?prop sub:eP (?p1 ?p2). ?prop sub:cP (?p1 ?p2). }
WHERE {#?prop sub:pP (?p1 ?p2) #intuitive but incorrect with SPARQL
?prop sub:pP [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2] ]
};
DELETE { ?prop sub:pP (?p1 ?p2 ?p3) }
INSERT{ ?prop sub:eP (?p1 ?p2 ?p3). ?prop sub:cP (?p1 ?p2 ?p3). }
WHERE {#?prop sub:pP (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?prop sub:pP [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?prop sub:pP (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?prop sub:eP (?p1 ?p2 ?p3 ?p4). ?prop sub:cP (?p1 ?p2 ?p3 ?p4). }
WHERE {#?prop sub:pP (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?prop sub:pP [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ]]]};
DELETE { ?prop sub:pP (?p1 ?p2 ?p3 ?p4 ?p5) }
INSERT{ ?prop sub:eP (?p1 ?p2 ?p3 ?p4 ?p5). ?prop sub:cP (?p1 ?p2 ?p3 ?p4 ?p5). }
WHERE {#?prop sub:pP (?p1 ?p2 ?p3 ?p4 ?p5) #intuitive but incorrect with SPARQL
?prop sub:pP [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5] ]]]]};
#------------------------ 1.2.1.4. sub:eC (sub:#exclusive_strict_subClasses),
# sub:eP (sub:exclusive_strict_subProperties; sub:eC counterpart)
#note: here, sub:eC and sub:eP are not explicitly defined as "incomplete"
# since this precision would not support additional inference possibilities
DELETE { ?class sub:eC (?p1 ?p2) }
INSERT{ ?class sub:strict_subClass ?p1, ?p2.
[] rdf:type owl:AllDisjointClasses; owl:members (?p1 ?p2) }
WHERE {#?class sub:eC (?p1 ?p2) #intuitive but incorrect with SPARQL
};
DELETE { ?class sub:eC (?p1 ?p2 ?p3) }
INSERT{ ?class sub:strict_subClass ?p1, ?p2, ?p3.
[] rdf:type owl:AllDisjointClasses; owl:members (?p1 ?p2 ?p3) }
WHERE {#?class sub:eC (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?class sub:eC [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ]]};
DELETE { ?class sub:eC (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?class sub:strict_subClass ?p1, ?p2, ?p3, ?p4.
[] rdf:type owl:AllDisjointClasses; owl:members (?p1 ?p2 ?p3 ?p4) }
WHERE {#?class sub:eC (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?class sub:eC [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ]]]};
DELETE { ?class sub:eC (?p1 ?p2 ?p3 ?p4 ?p5) }
INSERT{ ?class sub:strict_subClass ?p1, ?p2, ?p3, ?p4, ?p5.
[] rdf:type owl:AllDisjointClasses; owl:members (?p1 ?p2 ?p3 ?p4 ?p5) }
WHERE {#?class sub:eC (?p1 ?p2 ?p3 ?p4 ?p5) #intuitive but incorrect with SPARQL
?class sub:eC [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5]]]]]};
DELETE { ?prop sub:eP (?p1 ?p2) }
INSERT{ ?prop sub:strict_subProperty ?p1, ?p2. ?p1 owl:propertyDisjointWith ?p2 }
WHERE {#?prop sub:eP (?p1 ?p2) #intuitive but incorrect with SPARQL
?prop sub:eP [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2] ]
};
DELETE { ?prop sub:eP (?p1 ?p2 ?p3) }
INSERT{ ?prop sub:strict_subProperty ?p1, ?p2, ?p3.
?p1 owl:propertyDisjointWith ?p2, ?p3. ?p2 owl:propertyDisjointWith ?p3 }
WHERE {#?prop sub:eP (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?prop sub:eP [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?prop sub:eP (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?prop sub:strict_subProperty ?p1, ?p2, ?p3, ?p4.
?p1 owl:propertyDisjointWith ?p2, ?p3, ?p4.
?p2 owl:propertyDisjointWith ?p3, ?p4. ?p3 owl:propertyDisjointWith ?p4 }
WHERE {#?prop sub:eP (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?prop sub:eP [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ]]]};
DELETE { ?prop sub:eP (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?prop sub:strict_subProperty ?p1, ?p2, ?p3, ?p4, ?p5.
?p1 owl:propertyDisjointWith ?p2, ?p3, ?p4, ?p5.
?p2 owl:propertyDisjointWith ?p3, ?p4, ?p5.
?p3 owl:propertyDisjointWith ?p4, ?p5.
?p4 owl:propertyDisjointWith ?p5 }
WHERE {#?prop sub:eP (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?prop sub:eP [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5] ]]]]};
#------------------------ 1.2.1.5. sub:uoP (union of properties) and sub:cP;
# counterparts of sub:uoC (owl:unionOf) and sub:cC for properties
DELETE { ?p sub:cP (?p1 ?p2) }
INSERT{ ?p sub:uoP (?p1 ?p2). ?p1 sub:ne ?p2. }
WHERE {#?p sub:cP (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?p sub:cP [a rdf:List; rdf:first ?subI1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?p sub:cP (?p1 ?p2 ?p3) }
INSERT{ ?p sub:uoP (?p1 ?p2 ?p3). ?p2 sub:nePs (?p1 ?p2 ?p3). }
WHERE {#?p sub:cP (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?p sub:cP [a rdf:List; rdf:first ?subI1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?p sub:cP (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?p sub:uoP (?p1 ?p2 ?p3 ?p4). ?p2 sub:nePs (?p1 ?p2 ?p3 ?p4). }
WHERE {#?p sub:cP (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?p sub:cP [a rdf:List; rdf:first ?subI1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ] ] ] };
DELETE { ?p sub:cP (?p1 ?p2 ?p3 ?p4 ?p5) }
INSERT{ ?p sub:uoP (?p1 ?p2 ?p3 ?p4 ?p5). ?p2 sub:nePs (?p1 ?p2 ?p3 ?p4 ?p5). }
WHERE {#?p sub:cP (?p1 ?p2 ?p3 ?p4 ?p5) #intuitive but incorrect with SPARQL
?prop sub:cP [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5] ]]]]};
DELETE { ?p sub:uoP (?p1 ?p2 ?p3 ?p4 ?p5) }
INSERT{ ?p2345 sub:uoP (?p2 ?p3 ?p4 ?p5). ?p sub:uoP (?p1 ?p2345) }
WHERE {#?p sub:uoP (?p1 ?p2 ?p3 ?p4 ?p5) #intuitive but incorrect with SPARQL
?prop sub:uoP [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5] ]]]]};
DELETE { ?p sub:uoP (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?p234 sub:uoP (?p2 ?p3 ?p4). ?p sub:uoP (?p1 ?p234) }
WHERE {#?p sub:uoP (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?p sub:uoP [a rdf:List; rdf:first ?subI1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ] ] ] };
DELETE { ?p sub:uoP (?p1 ?p2 ?p3) }
INSERT{ ?p23 sub:uoP (?p2 ?p3). ?p sub:uoP (?p1 ?p23) }
WHERE {#?p sub:uoP (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?p sub:uoP [a rdf:List; rdf:first ?subI1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?p sub:uoP (?p1 ?p2) }
INSERT{
?p1 rdfs:subPropertyOf ?p . ?p2 rdfs:subPropertyOf ?p .
?p rdfs:domain [a owl:Class; owl:equivalentClass [owl:unionOf
( [a owl:Restriction; owl:onProperty ?p1; owl:minCardinality 1] #1. -(p1D.!p2D, ?p1R.p2R)
[a owl:Restriction; owl:onProperty ?p2; owl:minCardinality 1] #2. -(!p1D.p2D, p1R.?p2R)
) ] ];
rdfs:range [a owl:Class; owl:equivalentClass [owl:unionOf
( [a owl:Restriction; owl:onProperty [owl:inverseOf ?p1]; owl:minCardinality 1]
[a owl:Restriction; owl:onProperty [owl:inverseOf ?p2]; owl:minCardinality 1]
) ] ].
?p owl:disjointWith #remove a p b s.t. a p1 _ _ p2 b #1. -(p1D.!p2D, ?p1R.p2R)
[rdfs:domain # "without triplets having a subject of p1 and an object of p2"
[owl:intersectionOf
( [a owl:Restriction; owl:onProperty ?p1; owl:minCardinality 1]
[a owl:Restriction; owl:onProperty ?p2; owl:cardinality 0]
) ];
rdfs:range
[owl:intersectionOf
( [a owl:Restriction; owl:onProperty [owl:inverseOf ?p1]; owl:cardinality 0]
[a owl:Restriction; owl:onProperty [owl:inverseOf ?p2]; owl:minCardinality 1]
) ]
].
?p owl:disjointWith #remove a p b s.t. a p2 _ _ p1 b #2. -(!p1D.p2D, p1R.?p2R)
[rdfs:domain # "without triplets having a subject of p2 and an object of p1"
[owl:intersectionOf
( [a owl:Restriction; owl:onProperty ?p1; owl:cardinality 0]
[a owl:Restriction; owl:onProperty ?p2; owl:minCardinality 1]
) ];
rdfs:range
[owl:intersectionOf
( [a owl:Restriction; owl:onProperty [owl:inverseOf ?p1]; owl:minCardinality 1]
[a owl:Restriction; owl:onProperty [owl:inverseOf ?p2]; owl:cardinality 0]
) ]
]
}
WHERE {#?p sub:uoP (?p1 ?p2) #intuitive but incorrect with SPARQL
?p sub:uoP [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p] ]
};
#------------------------ 1.2.1.6. sub:neCs (non-equivalent nor exclusive classes), nePs
DELETE { ?prop sub:neCs (?p1 ?p2) }
INSERT{ ?prop sub:neC ?p1, ?p2. ?p1 sub:neC ?p2. }
WHERE {#?prop sub:neCs (?p1 ?p2) #intuitive but incorrect with SPARQL
?prop sub:neCs [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2] ]
};
DELETE { ?prop sub:neCs (?p1 ?p2 ?p3) }
INSERT{ ?prop sub:neC ?p1, ?p2, ?p3. ?p1 sub:neC ?p2, ?p3. ?p2 sub:neC ?p3 }
WHERE {#?prop sub:neCs (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?prop sub:neCs [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?prop sub:neCs (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?prop sub:neCs ?p1, ?p2, ?p3, ?p4. ?p1 sub:neC ?p2, ?p3, ?p4.
?p2 sub:neC ?p3, ?p4. ?p3 sub:neC ?p4 }
WHERE {#?prop sub:neCs (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?prop sub:neCs [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ]]]};
DELETE { ?prop sub:neCs (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?prop sub:neCs ?p1, ?p2, ?p3, ?p4, ?p5. ?p1 sub:neC ?p2, ?p3, ?p4, ?p5.
?p2 sub:neC ?p3, ?p4, ?p5. ?p3 sub:neC ?p4, ?p5. ?p4 sub:neC ?p5 }
WHERE {#?prop sub:neCs (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?prop sub:neCs [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5] ]]]]};
DELETE { ?prop sub:nePs (?p1 ?p2) }
INSERT{ ?prop sub:neP ?p1, ?p2. ?p1 sub:neP ?p2. }
WHERE {#?prop sub:nePs (?p1 ?p2) #intuitive but incorrect with SPARQL
?prop sub:nePs [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2] ]
};
DELETE { ?prop sub:nePs (?p1 ?p2 ?p3) }
INSERT{ ?prop sub:neP ?p1, ?p2, ?p3. ?p1 sub:neP ?p2, ?p3. ?p2 sub:neP ?p3 }
WHERE {#?prop sub:nePs (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?prop sub:nePs [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?prop sub:nePs (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?prop sub:nePs ?p1, ?p2, ?p3, ?p4. ?p1 sub:neP ?p2, ?p3, ?p4.
?p2 sub:neP ?p3, ?p4. ?p3 sub:neP ?p4 }
WHERE {#?prop sub:nePs (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?prop sub:nePs [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ]]]};
DELETE { ?prop sub:nePs (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?prop sub:nePs ?p1, ?p2, ?p3, ?p4, ?p5. ?p1 sub:neP ?p2, ?p3, ?p4, ?p5.
?p2 sub:neP ?p3, ?p4, ?p5. ?p3 sub:neP ?p4, ?p5. ?p4 sub:neP ?p5 }
WHERE {#?prop sub:nePs (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?prop sub:nePs [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5] ]]]]};
#************************ 1.3. Parts, Members and Their Inverses
#======================== 1.3.1. Strict Parts/Members and Their Inverses
# cf. http://www.webkb.org/kb/it/o_KR/p_kEvaluation/o_completeness/#ViaPart
#------------------------ 1.3.1.1. sub:sPart, counterpart of sC and sP for parts (from individuals)
#1) the case that implies sub:part (i.e. when ?part1 is not part-comparable/exclusive to ?part2):
DELETE { ?indiv sub:sPart ?part1, ?part2 }
INSERT{ ?indiv sub:part ?part1, ?part2 .
?part1 sub:part-uncomparable_but_not_part-exclusive ?part2 }
WHERE { ?indiv sub:sPart ?part1, ?part2 . #for any two parts ?part1 and ?part2
FILTER(?part1 != ?part2)
FILTER NOT EXISTS{ ?part1 sub:part_or_equivalent|owl:sameAs ?part2 }
FILTER NOT EXISTS{ ?part1 ^sub:part_or_equivalent|sub:part_exclusion ?part2 }
};
#2) the case where ?part1 is part-comparable to ?part2:
DELETE { ?indiv sub:sPart ?part1, ?part2 }
INSERT{ ?indiv sub:part ?part1, ?part2 }
WHERE { ?indiv sub:sPart ?part1, ?part2 . #for any two subclasses ?part1 and ?part2
FILTER(?part1 != ?part2)
FILTER EXISTS{ ?part1 sub:part_or_equivalent|sub:partOf|owl:sameAs ?part2 }
};
#3) the case where ?part1 is part-exclusive to ?part2:
DELETE { ?indiv sub:sPart ?part1, ?part2 }
INSERT{ ?indiv sub:part ?part1, ?part2 }
WHERE { ?indiv sub:sPart ?part1, ?part2 . #for any two subclasses ?part1 and ?part2
FILTER EXISTS{ ?part1 sub:part_exclusion ?part2 }
};
#------------------------ 1.3.1.2. sub:c_partOf, sub:c_part, sub:c_sPart
# (counterparts of sub:partOf, sub:part and sub:sPart, from types)
DELETE { ?class sub:c_partOf ?superpartClass }
INSERT{ ?class rdf:type rdfs:Class;
rdfs:subClassOf [rdf:type owl:Restriction; owl:onProperty sub:partOf;
owl:allValuesFrom ?superpartClass]. }
WHERE { ?class sub:c_partOf ?superpartClass };
DELETE { ?class sub:c_part ?subpartClass }
INSERT{ ?class rdf:type rdfs:Class;
rdfs:subClassOf [rdf:type owl:Restriction; owl:onProperty sub:part;
owl:allValuesFrom ?subpartClass]. }
WHERE { ?class sub:c_part ?subpartClass };
#1) the case that implies sub:c_part: when ?c_part1 is not c_part-comparable/disjoint to ?c_part2
DELETE { ?class sub:c_sPart ?c_part1, ?c_part2 }
INSERT{ ?class sub:c_part ?c_part1, ?c_part2 .
?c_part1 sub:c_part-uncomparable_but_not_part-disjoint ?c_part2 }
WHERE { ?class sub:c_sPart ?c_part1, ?c_part2 . #for any two parts ?c_part1 and ?c_part2
FILTER(?c_part1 != ?c_part2)
FILTER NOT EXISTS{ ?c_part1 sub:c_part_or_equivalent|sub:eqC ?c_part2 }
FILTER NOT EXISTS{ ?c_part1 ^sub:c_part_or_equivalent|sub:c_part_exclusion ?c_part2 }
};
#2) the case where ?c_part1 is part-comparable to ?c_part2:
DELETE { ?class sub:c_sPart ?c_part1, ?c_part2 }
INSERT{ ?class sub:c_part ?c_part1, ?c_part2 }
WHERE { ?class sub:c_sPart ?c_part1, ?c_part2 . #for any two subclasses ?c_part1 and ?c_part2
FILTER(?c_part1 != ?c_part2)
FILTER EXISTS{ ?c_part1 sub:c_part_or_equivalent|sub:c_partOf|sub:eqC ?c_part2 }
};
#3) the case where ?c_part1 is part-exclusive to ?c_part2:
DELETE { ?class sub:c_sPart ?c_part1, ?c_part2 }
INSERT{ ?class sub:c_part ?c_part1, ?c_part2 }
WHERE { ?class sub:c_sPart ?c_part1, ?c_part2 . #for any two subclasses ?c_part1 and ?c_part2
FILTER EXISTS{ ?c_part1 sub:c_part_exclusion ?c_part2 }
};
#------------------------ 1.3.1.3. sub:pParts, sub:c_pParts (part partitions for individuals/types)
# counterpart of sub:pC and sub:pP for parts
DELETE { ?indiv sub:pParts ( ?p1 ?p2 ) }
INSERT{ ?indiv sub:eParts ( ?p1 ?p2 ) . ?indiv sub:cParts ( ?p1 ?p2 ). }
WHERE {#?indiv sub:pParts ( ?p1 ?p2 ) #intuitive but incorrect with SPARQL
?indiv sub:parts [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2]].
};
DELETE { ?indiv sub:pParts (?p1 ?p2 ?p3) }
INSERT{ ?indiv sub:eParts (?p1 ?p2 ?p3). ?indiv sub:cParts (?p1 ?p2 ?p3). }
WHERE {#?indiv sub:pParts (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?indiv sub:pParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?indiv sub:pParts (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?indiv sub:eParts (?p1 ?p2 ?p3 ?p4). ?indiv sub:cParts (?p1 ?p2 ?p3 ?p4). }
WHERE {#?indiv sub:pParts (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?indiv sub:pParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ]]]};
DELETE { ?indiv sub:pParts (?p1 ?p2 ?p3 ?p4 ?p5) }
INSERT{ ?indiv sub:eParts (?p1 ?p2 ?p3 ?p4 ?p5). ?indiv sub:cParts (?p1 ?p2 ?p3 ?p4 ?p5). }
WHERE {#?indiv sub:pParts (?p1 ?p2 ?p3 ?p4 ?p5) #intuitive but incorrect with SPARQL
?indiv sub:pParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5] ]]]]};
DELETE { ?class sub:c_pParts ( ?p1 ?p2 ) }
INSERT{ ?class sub:c_eParts ( ?p1 ?p2 ) . ?class sub:c_cParts ( ?p1 ?p2 ). }
WHERE {#?class sub:c_pParts ( ?p1 ?p2 ) #intuitive but incorrect with SPARQL
?class sub:c_pPart [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2]].
};
DELETE { ?class sub:c_pParts (?p1 ?p2 ?p3) }
INSERT{ ?class sub:c_eParts (?p1 ?p2 ?p3). ?class sub:c_cParts (?p1 ?p2 ?p3). }
WHERE {#?class sub:c_pParts (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?class sub:c_pParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?class sub:c_pParts (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?class sub:c_eParts (?p1 ?p2 ?p3 ?p4). ?class sub:c_cParts (?p1 ?p2 ?p3 ?p4). }
WHERE {#?class sub:c_pParts (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?class sub:c_pParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ]]]};
DELETE { ?class sub:c_pParts (?p1 ?p2 ?p3 ?p4 ?p5) }
INSERT{ ?class sub:c_eParts (?p1 ?p2 ?p3 ?p4 ?p5). ?class sub:c_cParts (?p1 ?p2 ?p3 ?p4 ?p5). }
WHERE {#?class sub:c_pParts (?p1 ?p2 ?p3 ?p4 ?p5) #intuitive but incorrect with SPARQL
?class sub:c_pParts [a rdf:List; rdf:first ?p1;
rdf:rest[a rdf:List; rdf:first ?p2;
rdf:rest[a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest[a rdf:List; rdf:first ?p5] ]]]]};
#------------------------ 1.3.1.4. sub:eParts, sub:c_eParts
# counterpart of sub:eC and sub:eP for parts
#note: here, sub:eParts and sub:c_eParts are not explicitly defined as "incomplete"
# since this precision would not support additional inference possibilities
DELETE { ?indiv sub:eParts (?p1 ?p2) }
INSERT{ ?indiv sub:part ?p1, ?p2. ?p1 sub:part_exclusion ?p2 }
WHERE {#?indiv sub:eParts (?p1 ?p2) #intuitive but incorrect with SPARQL
?indiv sub:eParts [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2] ]
};
DELETE { ?indiv sub:eParts (?p1 ?p2 ?p3) }
INSERT{ ?indiv sub:part ?p1, ?p2, ?p3. ?p1 sub:part_exclusion ?p2, ?p3.
?p2 sub:part_exclusion ?p3 }
WHERE {#?indiv sub:eParts (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?indiv sub:eParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?indiv sub:eParts (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?indiv sub:part ?p1, ?p2, ?p3, ?p4. ?p1 sub:part_exclusion ?p2, ?p3, ?p4.
?p2 sub:part_exclusion ?p3, ?p4. ?p3 sub:part_exclusion ?p4 }
WHERE {#?indiv sub:eParts (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?indiv sub:eParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ]]]};
DELETE { ?indiv sub:eParts (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?indiv sub:part ?p1, ?p2, ?p3, ?p4, ?p5.
?p1 sub:part_exclusion ?p2, ?p3, ?p4, ?p5. ?p2 sub:part_exclusion ?p3, ?p4, ?p5.
?p3 sub:part_exclusion ?p4, ?p5. ?p4 sub:part_exclusion ?p5 }
WHERE {#?indiv sub:eParts (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?indiv sub:eParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5]]]]]};
DELETE { ?class sub:c_eParts (?p1 ?p2) }
INSERT{ ?class sub:c_part ?p1, ?p2. ?p1 sub:c_part_exclusion ?p2 }
WHERE {#?class sub:c_eParts (?p1 ?p2) #intuitive but incorrect with SPARQL
?class sub:c_eParts [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2] ]
};
DELETE { ?class sub:c_eParts (?p1 ?p2 ?p3) }
INSERT{ ?class sub:c_part ?p1, ?p2, ?p3. ?p1 sub:c_part_exclusion ?p2, ?p3.
?p2 sub:c_part_exclusion ?p3 }
WHERE {#?class sub:c_eParts (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?class sub:c_eParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?class sub:c_eParts (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?class sub:c_part ?p1, ?p2, ?p3, ?p4. ?p1 sub:c_part_exclusion ?p2, ?p3, ?p4.
?p2 sub:c_part_exclusion ?p3, ?p4. ?p3 sub:c_part_exclusion ?p4 }
WHERE {#?class sub:c_eParts (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?class sub:c_eParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ]]]};
DELETE { ?class sub:c_eParts (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?class sub:c_part ?p1, ?p2, ?p3, ?p4, ?p5.
?p1 sub:c_part_exclusion ?p2, ?p3, ?p4, ?p5. ?p2 sub:c_part_exclusion ?p3, ?p4, ?p5.
?p3 sub:c_part_exclusion ?p4, ?p5. ?p4 sub:c_part_exclusion ?p5 }
WHERE {#?class sub:c_eParts (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?class sub:c_eParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5]]]]]};
#------------------------ 1.3.1.5. sub:cParts, sub:c_cParts
# counterpart of sub:cC and sub:cP for parts
DELETE { ?p sub:cParts (?p1 ?p2 ?p3 ?p4 ?p5) }
INSERT{ ?p2345 sub:cParts (?p2 ?p3 ?p4 ?p5). ?p sub:cParts (?p1 ?p2345) }
WHERE {#?p sub:cParts (?p1 ?p2 ?p3 ?p4 ?p5) #intuitive but incorrect with SPARQL
?prop sub:cParts [a rdf:List; rdf:first ?p1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5] ]]]]};
DELETE { ?p sub:cParts (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?p234 sub:cParts (?p2 ?p3 ?p4). ?p sub:cParts (?p1 ?p234) }
WHERE {#?p sub:cParts (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?p sub:cParts [a rdf:List; rdf:first ?subI1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ] ] ] };
DELETE { ?p sub:cParts (?p1 ?p2 ?p3) }
INSERT{ ?p23 sub:cParts (?p2 ?p3). ?p sub:cParts (?p1 ?p23) }
WHERE {#?p sub:cParts (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?p sub:cParts [a rdf:List; rdf:first ?subI1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?indiv sub:cParts ( ?p1 ?p2 ) }
INSERT{ ?indiv sub:part ?p1, ?p2 .
#any part of ?indiv is also a part of ?p1 or a part of ?p2,
# hence the class for parts of ?indiv is a union of
# "the class of the parts of ?p1" and "the class of the parts of ?sub2"
?classForSubI1Parts #the instances of this class are sub:partOf ?p1
owl:equivalentClass [rdf:type owl:Restriction; owl:onProperty sub:partOf;
owl:someValuesFrom ?p1 ] .
?classForSubI2Parts #the instances of this class are sub:partOf ?p2
owl:equivalentClass [rdf:type owl:Restriction; owl:onProperty sub:partOf;
owl:someValuesFrom ?p2 ] .
?classForIndivParts
owl:equivalentClass [rdf:type owl:Restriction; owl:onProperty sub:partOf;
owl:someValuesFrom ?classForIndivParts ];
owl:equivalentClass [owl:unionOf (?classForSubI1Parts ?classForSubI2Parts)] }
WHERE { # ?indiv sub:cParts ( ?p1 ?p2 ) #intuitive but incorrect with SPARQL
?indiv sub:cParts [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2] ].
BIND( uri(concat("class_for_",str(?p1))) as ?classForSubI1Parts )
BIND( uri(concat("class_for_",str(?p2))) as ?classForSubI2Parts )
BIND( uri(concat("class_for_",str(?indiv))) as ?classForIndivParts )
};
DELETE { ?p sub:c_cParts (?p1 ?p2 ?p3 ?p4 ?p5) }
INSERT{ ?p2345 sub:c_cParts (?p2 ?p3 ?p4 ?p5). ?p sub:c_cParts (?p1 ?p2345) }
WHERE {#?p sub:c_cParts (?p1 ?p2 ?p3 ?p4 ?p5) #intuitive but incorrect with SPARQL
?prop sub:c_cParts [a rdf:List; rdf:first ?p1;
rdf:rest[a rdf:List; rdf:first ?p2;
rdf:rest[a rdf:List; rdf:first ?p3;
rdf:rest[a rdf:List; rdf:first ?p4;
rdf:rest [a rdf:List; rdf:first ?p5] ]]]]};
DELETE { ?p sub:c_cParts (?p1 ?p2 ?p3 ?p4) }
INSERT{ ?p234 sub:c_cParts (?p2 ?p3 ?p4). ?p sub:c_cParts (?p1 ?p234) }
WHERE {#?p sub:c_cParts (?p1 ?p2 ?p3 ?p4) #intuitive but incorrect with SPARQL
?p sub:c_cParts [a rdf:List; rdf:first ?subI1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3;
rdf:rest [a rdf:List; rdf:first ?p4] ] ] ] };
DELETE { ?p sub:c_cParts (?p1 ?p2 ?p3) }
INSERT{ ?p23 sub:c_cParts (?p2 ?p3). ?p sub:c_cParts (?p1 ?p23) }
WHERE {#?p sub:c_cParts (?p1 ?p2 ?p3) #intuitive but incorrect with SPARQL
?p sub:c_cParts [a rdf:List; rdf:first ?subI1;
rdf:rest [a rdf:List; rdf:first ?p2;
rdf:rest [a rdf:List; rdf:first ?p3] ] ] };
DELETE { ?class sub:c_cParts ( ?p1 ?p2 ) }
INSERT{ ?class sub:c_part ?p1, ?p2; owl:equivalentClass [owl:unionOf (?p1 ?p2)] }
WHERE { # ?class sub:c_cParts ( ?p1 ?p2 ) #intuitive but incorrect with SPARQL
?class sub:c_cParts [a rdf:List; rdf:first ?p1; rdf:rest [a rdf:List; rdf:first ?p2] ].
};
#************************ 1.4. Contextualizing Or Negating Relations
DELETE { ?rt1 sub:propertySymmetricNegation ?rt2 }
INSERT{ [] rdf:type owl:NegativePropertyAssertion; owl:assertionProperty ?rt2;
owl:sourceIndividual ?indiv1; owl:targetIndividual ?indiv2 .
[] rdf:type owl:NegativePropertyAssertion; owl:assertionProperty ?rt2;
owl:sourceIndividual ?indiv2; owl:targetIndividual ?indiv1 . }
WHERE { ?rt1 sub:propertySymmetricNegation ?rt2 . ?indiv1 ?rt1 ?indiv2 };
DELETE { ?class sub:c_part_exclusion ?class2 }
INSERT{ ?class rdf:type rdfs:Class;
rdfs:subClassOf [rdf:type owl:Restriction; owl:onProperty sub:part_exclusion;
owl:allValuesFrom ?class2]. }
WHERE { ?class sub:c_part_exclusion ?class2 };