-- Load Raw Data about Royals SPARQL DEFINE sql:log-enable 3 PREFIX wdrs: WITH INSERT { ## Custom Entity Relationship Types (Relations) ## <#hasRelative> a rdf:Property ; rdfs:label "hasRelative" ; rdfs:comment """Generic Family Relationship""" ; rdfs:domain foaf:Person ; rdfs:range <#MalePerson>, <#FemalePerson>, <#RoyalPerson>, foaf:Person, schema:Person ; wdrs:describedby <#> . <#hasUncle> a rdf:Property ; rdfs:subPropertyOf <#hasRelative> ; rdfs:label "hasUncle" ; rdfs:comment """Relationship Type that's derived from a SPARQL-based Custom Inference Rule that associates a Person with a Male Person that's a sibling of one of their Parents. """ ; rdfs:domain foaf:Person ; rdfs:range <#MalePerson> ; wdrs:describedby <#> . <#hasAuntie> a rdf:Property ; rdfs:subPropertyOf <#hasRelative> ; rdfs:label "hasAuntie" ; rdfs:comment """Relationship Type that's derived from a SPARQL-based Custom Inference Rule that associates a Person with a Female Person that's a sibling of one of their Parents. """ ; rdfs:domain foaf:Person ; rdfs:range <#FemalePerson> ; wdrs:describedby <#> . <#hasCousin> a rdf:Property ; rdfs:subPropertyOf <#hasRelative> ; rdfs:label "hasCousin" ; rdfs:comment """Relationship Type that's derived from a SPARQL-based Custom Inference Rule that associates a Person with another Person; that's a child of the sibling of one of their Parents. """ ; rdfs:domain foaf:Person ; rdfs:range <#FemalePerson>, <#MalePerson> ; wdrs:describedby <#> . ## Custom Entity Types (Classes) ## <#FemalePerson> rdfs:subClassOf foaf:Person ; rdfs:label "Female Person Class" ; rdfs:comment """ A female person that inherits properties of the Person class identified by relative URI: foaf:Person. The properties of this class are defined using custom inference rules using SPARQL via . """ ; wdrs:describedby <#> . <#MalePerson> rdfs:subClassOf foaf:Person ; rdfs:label "Male Person Class" ; rdfs:comment """ A male person that inherits properties of the Person class identified by relative URI: foaf:Person. The properties of this class are defined using custom inference rules using SPARQL via . """ ; wdrs:describedby <#> . ## Entity Relationships ## a foaf:Person, <#MalePerson> ; schema:name "Prince William" ; rel:siblingOf . a foaf:Person, <#FemalePerson> ; schema:name "Queen Mother" ; rel:parentOf . a foaf:Person, <#FemalePerson> ; schema:name "Queen Elizabeth II" ; rel:parentOf , , , ; rel:siblingOf . a foaf:Person, <#MalePerson> ; schema:name "Prince Charles" ; rel:parentOf , . a foaf:Person, <#FemalePerson> ; schema:name "Princess Margaret" ; rel:parentOf , . a foaf:Person, <#FemalePerson> ; schema:name "Princess Anne" ; rel:parentOf , . a foaf:Person, <#FemalePerson> ; schema:name "Princess Zara Phillips" . a foaf:Person, <#FemalePerson> ; schema:name "Princess Beatrice" . a foaf:Person, <#FemalePerson> ; schema:name "Princess Eugenie" . a foaf:Person, <#FemalePerson> ; schema:name "Lady Sarah Chatto" . a foaf:Person, <#MalePerson> ; schema:name "Prince Andrew" ; rel:parentOf , . a foaf:Person, <#MalePerson> ; schema:name "Prince Edward" . a foaf:Person, <#MalePerson> ; schema:name "Prince Harry" . a foaf:Person, <#MalePerson> ; schema:name "Prince Peter Phillips" . a foaf:Person, <#MalePerson> ; schema:name "Viscount Linley" . } ; -- Class Definition that includes SPIN Rules SPARQL CLEAR GRAPH ; SPARQL PREFIX rel: PREFIX wdrs: prefix spin: PREFIX sp: PREFIX spl: PREFIX rdfs: WITH INSERT { <#RoyalPerson> a rdfs:Class ; rdfs:label "A Royal Person"^^xsd:string ; rdfs:subClassOf foaf:Person, schema:Person ; spin:rule [ a sp:Construct ; sp:text """ # must be related to Queen Elizabeth II CONSTRUCT { ?n a ?this . } WHERE { { ?n rel:descendantOf+|rel:ancestorOf+|rel:siblingOf|^rel:siblingOf . } # ?n <#hasRelative> | ^<#hasRelative> . } """ ] ; spin:rule [ a sp:Construct ; sp:text """ CONSTRUCT { ?this rel:grandParent ?grandchild } WHERE { { ?this rel:parentOf [ rel:parentOf ?grandchild ] . } } """ ] ; spin:rule [ a sp:Construct ; sp:text """ CONSTRUCT { ?this rel:ancestorOf ?n } WHERE { { ?this rel:parentOf+|^rel:descendantOf ?n . } } """ ] ; spin:rule [ a sp:Construct ; sp:text """ CONSTRUCT { ?this rel:descendantOf ?n } WHERE { { ?this ^rel:parentOf+ ?n . } } """ ] ; spin:rule [ a sp:Construct ; sp:text """ CONSTRUCT { ?this rel:siblingOf ?n } WHERE { { [] rel:parentOf ?this, ?n. FILTER (?n != ?this) . } } """ ] ; spin:rule [ a sp:Construct ; sp:text """ CONSTRUCT { ?this <#hasAuntie> ?auntie } WHERE { { [] rel:parentOf ?parent, ?auntie. ?parent rel:parentOf ?this . FILTER (?auntie != ?parent) . ?auntie a <#FemalePerson> . } } """ ] ; spin:rule [ a sp:Construct ; sp:text """ CONSTRUCT { ?this <#hasUncle> ?uncle } WHERE { { [] rel:parentOf ?parent, ?uncle . ?parent rel:parentOf ?this . FILTER (?uncle != ?parent) . ?uncle a <#MalePerson> . } } """ ] ; spin:rule [ a sp:Construct ; sp:text """ CONSTRUCT { ?this <#hasCousin> ?cousin } WHERE { { [] rel:parentOf ?cousin_parent, ?parent . ?cousin_parent rel:parentOf ?cousin . ?parent rel:parentOf ?this . FILTER (?cousin_parent != ?parent) } } """ ]. } ; -- Macro Generation SELECT SPARQL_SPIN_GRAPH_TO_DEFSPIN('urn:spin:nanotation:demo:royal:family:lib3'); string_to_file ('urn_spin_nanotation_demo_royal_family_lib2.sparql.sql', 'sparql ' || SPARQL_SPIN_GRAPH_TO_DEFSPIN('urn:spin:nanotation:demo:royal:family:lib3') || ';', -2); exec ('sparql ' || SPARQL_SPIN_GRAPH_TO_DEFSPIN('urn:spin:nanotation:demo:royal:family:lib3')); -- Test Queries SPARQL DEFINE input:macro-lib PREFIX rel: WITH SELECT ?person rel:siblingOf as ?relation ?sibling WHERE { ?person a <#RoyalPerson> ; rel:siblingOf ?sibling . }; -- Test 0 SPARQL DEFINE input:macro-lib PREFIX rel: WITH SELECT ?person rel:grandParentOf as ?relation ?grandParent WHERE { ?person a <#RoyalPerson> ; rel:grandParent ?grandParent . }; -- Test 1 SPARQL DEFINE input:macro-lib PREFIX rel: WITH SELECT ?person rel:ancestorOf as ?relation ?descendant WHERE { ?person a <#RoyalPerson> ; rel:ancestorOf ?descendant } ; -- Test 2 SPARQL DEFINE input:macro-lib PREFIX rel: WITH SELECT DISTINCT ?person rel:siblingOf as ?relation ?siblingOf WHERE { ?person a <#RoyalPerson> ; rel:siblingOf ?siblingOf } ; -- Test 3 SPARQL DEFINE input:macro-lib PREFIX rel: WITH SELECT ?person <#hasAuntie> as ?relation ?hasAuntie WHERE { ?person a <#RoyalPerson> ; <#hasAuntie> ?hasAuntie } ; -- Test 4 SPARQL DEFINE input:macro-lib PREFIX rel: WITH SELECT ?person <#hasUncle> as ?relation ?hasUncle WHERE { ?person a <#RoyalPerson> ; <#hasUncle> ?hasUncle } ; -- Test 5 SPARQL DEFINE input:macro-lib PREFIX rel: WITH SELECT ?person <#hasCousin> as ?relation ?hasCousin WHERE { ?person a <#RoyalPerson> ; <#hasCousin> ?hasCousin } ; -- Test 6 SPARQL DEFINE input:macro-lib PREFIX rel: WITH SELECT ?s as ?ancestor ?descendant WHERE { ?s a <#RoyalPerson> ; rel:ancestorOf ?descendant }; -- Test 7 SPARQL DEFINE input:macro-lib PREFIX rel: WITH SELECT DISTINCT * WHERE { { ?parent a <#RoyalPerson> ; rel:parentOf ?parentOf .} UNION { ?parent a <#RoyalPerson> ; rel:grandParentOf ?parentOf .} UNION { ?person a <#RoyalPerson> ; <#hasAuntie> ?hasAuntie .} UNION { ?person a <#RoyalPerson> ; <#hasUncle> ?hasUncle .} UNION { ?person a <#RoyalPerson> ; <#hasCousin> ?hasCousin .} UNION { ?person a <#RoyalPerson> ; rel:siblingOf ?hasSibling . } UNION { ?person a <#RoyalPerson> ; rel:ancestorOf ?hasDescendant . } } ;