30
31
32:- module(rdfslite_entailment,
33 [
34 ]). 35:- use_module(rdfql(rdfql_runtime)). 36:- use_module(library('semweb/rdf_db'),
37 [ rdf_global_id/2,
38 rdf_reachable/3,
39 rdf_has/3,
40 rdf_has/4,
41 rdf_subject/1,
42 rdf_equal/2,
43 (rdf_meta)/1,
44 op(_,_,_)
45 ]). 46:- use_module(library('semweb/rdfs'),
47 [ rdfs_subclass_of/2,
48 rdfs_subproperty_of/2,
49 rdfs_individual_of/2
50 ]).
69:- rdf_meta
70 rdf(o,o,o). 71
72:- public
73 rdf/3,
74 rdf/4. 75
76rdf(S, P, O) :-
77 var(P), !,
78 rdf_db:rdf(S,P,O).
79rdf(S, serql:directSubClassOf, O) :- !,
80 rdf_has(S, rdfs:subClassOf, O).
81rdf(S, serql:directType, O) :- !,
82 rdf_has(S, rdf:type, O).
83rdf(S, serql:directSubPropertyOf, O) :- !,
84 rdf_has(S, rdfs:subPropertyOf, O).
85rdf(S, rdfs:subClassOf, O) :- ( atom(S) ; atom(O) ), !,
86 rdf_reachable(S, rdfs:subClassOf, O).
87rdf(S, rdfs:subClassOf, O) :- !,
88 rdf_has(S, rdfs:subClassOf, Direct),
89 rdf_reachable(Direct, rdfs:subClassOf, O).
90rdf(S, rdfs:subPropertyOf, O) :- !,
91 rdf_reachable(S, rdfs:subPropertyOf, O).
92rdf(S, rdf:type, O) :- !,
93 ( var(S), var(O)
94 -> rdf_subject(S)
95 ; true
96 ),
97 rdfs_individual_of(S, O).
98rdf(S, P, O) :-
99 rdf_has(S, P, O).
103rdf(S, P, O, G) :-
104 var(P),
105 !,
106 rdf_db:rdf(S, P, O, G).
107rdf(S, P, O, G) :-
108 rdf_has(S, P, O, RP),
109 rdf_db:rdf(S, RP, O, G).
110
111 114
115:- multifile
116 cliopatria:entailment/2. 117
118cliopatria:entailment(rdfslite, rdfslite_entailment)
RDFS-Lite entailment
The function of an entailment module is to provide an implementation of rdf/3 that extends basic triple-lookup using the entailment rules of the semantic web sub language of RDF.
This entailment module does the part of RDFS that can be implemented efficiently using backward chaining. Notably it does not do type-reasoning on the basis of domains/ranges of properties. It does:
*/