30
31
32:- module(rdfs_entailment,
33 [
34 ]). 35:- use_module(rdfql(rdfql_runtime)). 36:- use_module(library(nb_set)). 37:- use_module(library('semweb/rdf_db'),
38 [ rdf_current_predicate/1,
39 rdf_global_id/2,
40 rdf_reachable/3,
41 rdf_has/3,
42 rdf_has/4,
43 rdf_subject/1,
44 rdf_equal/2,
45 (rdf_meta)/1,
46 op(_,_,_)
47 ]). 48:- use_module(library('semweb/rdfs'),
49 [ rdfs_subclass_of/2,
50 rdfs_subproperty_of/2
51 ]).
64:- rdf_meta
65 rdf(o,o,o),
66 individual_of(r,r). 67
68:- public
69 rdf/3,
70 rdf/4. 71
72rdf(literal(L), _, _) :- 73 nonvar(L), !, fail.
74rdf(_, literal(L), _) :- 75 nonvar(L), !, fail.
76rdf(S, P, O) :-
77 var(P), !,
78 ( rdf_db:rdf(S,P,O)
79 ; rdf(P, rdf:type, rdf:'Property'),
80 rdf(S, P, O),
81 \+ rdf_db:rdf(S,P,O)
82 ).
83rdf(S, P, C) :-
84 rdf_reachable(rdf:type, rdfs:subPropertyOf, P), !,
85 individual_of(S, C).
86rdf(S, P, O) :- 87 rdf_reachable(rdfs:subClassOf, rdfs:subPropertyOf, P), !,
88 ( (nonvar(S) ; nonvar(O))
89 -> rdfs_subclass_of(S, O) 90 ; individual_of(S, rdfs:'Class'), 91 rdfs_subclass_of(S, O)
92 ).
93rdf(S, rdfs:subPropertyOf, O) :- !,
94 ( nonvar(S)
95 -> individual_of(S, rdf:'Property'),
96 rdfs_subproperty_of(S, O)
97 ; nonvar(O)
98 -> individual_of(O, rdf:'Property'),
99 rdfs_subproperty_of(S, O)
100 ; individual_of(S, rdf:'Property'),
101 rdfs_subproperty_of(S, O)
102 ).
103rdf(S, serql:directSubClassOf, O) :- !,
104 rdf_has(S, rdfs:subClassOf, O).
105rdf(S, serql:directType, O) :- !,
106 rdf_has(S, rdf:type, O).
107rdf(S, serql:directSubPropertyOf, O) :- !,
108 rdf_has(S, rdfs:subPropertyOf, O).
109rdf(S, P, O) :-
110 rdf_has(S, P, O).
114rdf(S, P, O, G) :-
115 var(P),
116 !,
117 rdf_db:rdf(S, P, O, G).
118rdf(S, P, O, G) :-
119 rdf_has(S, P, O, RP),
120 rdf_db:rdf(S, RP, O, G).
125individual_of(Resource, Class) :-
126 nonvar(Resource), !,
127 ( Resource = literal(_)
128 -> rdfs_subclass_of(Class, rdfs:'Literal')
129 ; rdfs_has_type(Resource, MyClass),
130 rdfs_subclass_of(MyClass, Class)
131 ; rdf_equal(Class, rdfs:'Resource')
132 ).
133individual_of(Resource, Class) :-
134 nonvar(Class), !,
135 ( rdf_equal(Class, rdfs:'Resource')
136 -> rdf_subject(Resource)
137 ; rdfs_subclass_of(SubClass, Class),
138 rdfs_has_type(Resource, SubClass)
139 ).
140individual_of(Resource, Class) :-
141 rdf_subject(Resource),
142 individual_of(Resource, Class).
151rdfs_has_type(Resource, Class) :-
152 empty_nb_set(Set),
153 ( atom(Resource)
154 -> ( rdf_has(Resource, rdf:type, Class)
155 ; rdf_db:rdf(Resource, P, _),
156 rdf_has(P, rdfs:domain, Class)
157 ; rdf_db:rdf(_, P, Resource),
158 rdf_has(P, rdfs:range, Class)
159 ; rdf_db:rdf(Resource, rdfs:subPropertyOf, _),
160 rdf_equal(Class, rdf:'Property')
161 ; rdf_db:rdf(_, rdfs:subPropertyOf, Resource),
162 rdf_equal(Class, rdf:'Property')
163 ; ( rdf_db:rdf(_,Resource,_)
164 -> rdf_equal(Class, rdf:'Property'),
165 \+ rdf_has(Resource, rdf:type, Class)
166 )
167 ),
168 add_nb_set(Class, Set, New),
169 New == true
170 ; atom(Class)
171 -> ( rdf_has(Resource, rdf:type, Class)
172 ; rdf_has(P, rdfs:domain, Class),
173 rdf_has(Resource, P, _)
174 ; rdf_has(P, rdfs:range, Class),
175 rdf_has(_, P, Resource)
176 ; ( rdf_reachable(Class, rdfs:subClassOf, rdf:'Property')
177 -> rdf_current_predicate(Resource),
178 ( rdf(_,Resource,_)
179 -> \+ rdf_has(Resource, rdf:type, Class)
180 )
181 )
182 ),
183 add_nb_set(Resource, Set, New),
184 New == true
185 ; throw(error(instantiation_error, _))
186 ).
187
188
189 192
193:- multifile
194 cliopatria:entailment/2. 195
196cliopatria:entailment(rdfs, rdfs_entailment)
RDFS 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 RDFS entailment.