forked from sklarman/Big-Mechanism-Assembly
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBMsemWebTools.pl
311 lines (254 loc) · 11.4 KB
/
BMsemWebTools.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
:- use_module(library(semweb/rdf_db)).
:- use_module(library(semweb/rdf_http_plugin)).
:- use_module(library(semweb/rdfs)).
:- use_module(library(semweb/sparql_client)).
:- use_module(library(http/json)).
:- use_module(library(http/http_digest)).
:- use_module(library(http/http_open)).
:- use_module(library(semweb/rdf_ntriples)).
:- rdf_reset_db.
:- rdf_register_prefix(unprot, 'http://identifiers.org/uniprot/').
:- rdf_register_prefix(bm, 'http://purl.bioontology.org/net/brunel/bm/').
:- rdf_register_prefix(panda, 'http://purl.bioontology.org/net/brunel/panda#').
:- rdf_register_prefix(uno, 'http://purl.bioontology.org/net/brunel/uno#').
:- rdf_register_prefix(owl, 'http://www.w3.org/2002/07/owl#').
:- rdf_register_prefix(xsd, 'http://www.w3.org/2001/XMLSchema#').
:- rdf_register_prefix(rdfs, 'http://www.w3.org/2000/01/rdf-schema#').
:- rdf_register_prefix(rdf, 'http://www.w3.org/1999/02/22-rdf-syntax-ns#').
:- rdf_register_prefix(void, 'http://rdfs.org/ns/void#').
:- rdf_register_prefix(dc, 'http://purl.org/dc/elements/1.1/').
:- rdf_register_prefix(dct, 'http://purl.org/dc/terms/').
:- rdf_register_prefix(prov, 'http://www.w3.org/ns/prov-o#').
:- rdf_meta sparqlTerm(r, -).
:- dynamic log_stream/1.
:- dynamic outStream/2.
:- ['BMparams.pl'],
file_search_path(my_home, Dir2), !,
string_concat(Dir2, '/log_indexCardAssembly.txt', LogFile),
open(LogFile, write, Stream),
%debug(http(_)),
asserta(log_stream(Stream)).
panda_graph('http://purl.bioontology.org/net/brunel/panda').
event_graph('http://purl.bioontology.org/net/brunel/bm/event_graph').
submitter_graph('http://purl.bioontology.org/net/brunel/bm/submitter_graph').
source_graph('http://purl.bioontology.org/net/brunel/bm/source_graph').
journal_graph('http://purl.bioontology.org/net/brunel/bm/journal_graph_2015').
openOutputs :-
open('AssembledOutput/events.nt', write, StreamEvent),
open('AssembledOutput/statements.nt', write, StreamStats),
open('AssembledOutput/submitter.nt', write, StreamSubmit),
open('AssembledOutput/journal.nt', write, StreamJournal),
open('AssembledOutput/source.nt', write, StreamSource),
set_stream(StreamEvent, encoding(utf8)),
set_stream(StreamStats, encoding(utf8)),
set_stream(StreamSubmit, encoding(utf8)),
set_stream(StreamJournal, encoding(utf8)),
set_stream(StreamSource, encoding(utf8)),
asserta(outStream('http://purl.bioontology.org/net/brunel/bm/event_graph', StreamEvent)),
asserta(outStream('http://purl.bioontology.org/net/brunel/bm/index_card_graph', StreamStats)),
asserta(outStream('http://purl.bioontology.org/net/brunel/bm/submitter_graph', StreamSubmit)),
asserta(outStream('http://purl.bioontology.org/net/brunel/bm/journal_graph_2015', StreamJournal)),
asserta(outStream('http://purl.bioontology.org/net/brunel/bm/source_graph', StreamSource)), !.
outStream(Graph, Stream) :-
index_graph(Graph),
outStream('http://purl.bioontology.org/net/brunel/bm/index_card_graph', Stream), !.
closeOutputs :-
findall(_, (
outStream(Graph, Stream),
close(Stream),
retract(outStream(Graph, Stream))
), _),
convert_ntriples('AssembledOutput/events.nt'),
convert_ntriples('AssembledOutput/statements.nt'),
convert_ntriples('AssembledOutput/submitter.nt'),
convert_ntriples('AssembledOutput/journal.nt'),
convert_ntriples('AssembledOutput/source.nt').
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RDF graph manager
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
saveGraph(Graph) :-
file_search_path(my_home, Dir),
atomic_list_concat([Dir, '/', Graph, '.rdf'], OutputPath), !,
rdf_save(OutputPath, [encoding(utf8)]).
%pushGraph(RDFgraph) :-
% findall([X, Y, Z], rdf(X, Y, Z, RDFgraph), GraphPattern),
% sparqlInsertQuery(GraphPattern, RDFgraph),
% rdf_retractall(_, _, _, RDFgraph).
pushTriples(Triples, Graph) :-
outStream(Graph, Stream),
findall(_, (
member([X, Y, Z], Triples),
sparqlTerm(X, XTerm),
sparqlTerm(Y, YTerm),
sparqlTerm(Z, ZTerm),
atomic_list_concat([XTerm, YTerm, ZTerm, '.'], ' ', DataLine),
writeln(Stream, DataLine)
), _).
convert_ntriples(File) :-
write('Converting file: '), writeln(File),
open(File, read, Stream),
assertall(File, Stream).
assertall(File, Stream) :-
read_ntriple(Stream, triple(X, Y, Z)) ->
((\+rdf(X, Y, Z) -> rdf_assert(X, Y, Z);true),
assertall(File, Stream));
(writeln('Saving graph...'),
saveGraph(File),
rdf_retractall(_, _, _)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SPARQL manager
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
askSparqlQuery(Query, Result) :-
sparql_setup(Host, Port, Path, Author),
sparql_query(Query, Result, [host(Host), port(Port), path(Path), status_code(_), Author]).
askHttpSparql(Query, Format, Result, Code) :-
sparql_setup(Host, Port, Path, Author),
http_open([ host(Host), port(Port), path(Path), search([query=Query, format=Format])], Result, [status_code(Code), connection('keep-alive'), Author]),
nonvar(Result).
sparqlJsonQuery(Query, Tuple) :-
askHttpSparql(Query, 'application/json', JsonStream, Code),
set_stream(JsonStream, encoding(utf8)),
(\+Code = 200 -> (Tuple=[], atomic_list_concat(['Error: ', Code, ' on ', Query], ErrorMessage), writeln(ErrorMessage));
(json_read(JsonStream, json(Result)),
member((results=json(X)),Result),
member((bindings=Z), X),
member(json(JsonTup), Z),
findall(Val, (member(_=json(Bind), JsonTup),
member(value=Val, Bind)), Tuple))).
%,
%writeln(Tuple).
sparqlJsonQueryExplicitVar(Query, Tuple) :-
askHttpSparql(Query, 'application/json', JsonStream, Code),
set_stream(JsonStream, encoding(utf8)),
(\+Code = 200 -> (Tuple=[], atomic_list_concat(['Error: ', Code, ' on ', Query], ErrorMessage), writeln(ErrorMessage));
(json_read(JsonStream, json(Result)),
member((results=json(X)),Result),
member((bindings=Z), X),
member(json(JsonTup), Z),
findall(Ke=Val, (member(Ke=json(Bind), JsonTup),
member(value=Val, Bind)), Tuple))).
sparqlInsertQuery(Graph, RDFgraph) :-
triplePatternGenerator(Graph, TriplePattern), !,
atomic_list_concat(['INSERT {GRAPH <', RDFgraph,'> {', TriplePattern, '}}'], Query),
% log_writeln(''), log_writeln(Query),
sparql_setup(Host, Port, Path, Author),
http_open([host(Host), port(Port), path(Path), search([query=Query])], _, [connection('keep-alive'), Author]).
sparqlSelectQuery(Graph, RDFgraph, Tuple) :-
triplePatternGenerator(Graph, TriplePattern), !,
atomic_list_concat(['SELECT * WHERE {GRAPH <', RDFgraph,'> {', TriplePattern, '}}'], Query),
% log_writeln(''), log_writeln(Query),
sparqlJsonQuery(Query, Tuple).
sparqlSelectQueryGlobal(Graph, QueryVariables, Tuple) :-
triplePatternGenerator(Graph, TriplePattern), !,
atomic_list_concat(['SELECT DISTINCT ', QueryVariables, ' WHERE {', TriplePattern, '}'], Query),
% log_writeln(''), log_writeln(Query), !,
sparqlJsonQuery(Query, Tuple).
sparqlSelectQueryGlobalExplicitVar(Graph, QueryVariables, Tuple) :-
triplePatternGenerator(Graph, TriplePattern), !,
atomic_list_concat(['SELECT DISTINCT ', QueryVariables, ' WHERE {', TriplePattern, '}'], Query),
sparqlJsonQueryExplicitVar(Query, Tuple).
sparqlClearGraph(Graph) :-
atomic_list_concat(['CLEAR GRAPH <',Graph,'>'], Query),
writeln(Query),
sparql_setup(Host, Port, Path, Author),
http_open([host(Host), port(Port), path(Path), search([query=Query])], _, [status_code(_), connection('keep-alive'), Author]).
triplePatternGenerator(Graph, TriplePattern) :-
tripleSetGenerator(Graph, TripleSet),
atomic_list_concat(TripleSet, '. ', TriplePattern).
tripleSetGenerator([], []) :- !.
tripleSetGenerator([[X, Y, Z]|Rest], [Triple|RestTriples]) :-
tripleSetGenerator(Rest, RestTriples),
sparqlTerm(X, Xterm),
sparqlTerm(Y, Yterm),
sparqlTerm(Z, Zterm),
atomic_list_concat([Xterm, Yterm, Zterm], ' ', Triple).
tripleSetGenerator([not(NotTriples)|Rest], [Triple|RestTriples]) :-
tripleSetGenerator(Rest, RestTriples),
triplePatternGenerator(NotTriples, NotPattern),
atomic_list_concat(['filter not exists {', NotPattern, '}'], ' ', Triple).
tripleSetGenerator([optional(OptTriples)|Rest], [Triple|RestTriples]) :-
tripleSetGenerator(Rest, RestTriples),
triplePatternGenerator(OptTriples, OptPattern),
atomic_list_concat(['OPTIONAL {', OptPattern, '}'], ' ', Triple).
substitute(_, _, [], []) :- !.
substitute(Var, Term, [OldTriple|OldRest], [NewTriple|NewRest]) :-
\+OldTriple = not(_),
(member(Var, OldTriple) -> select(Var, OldTriple, Term, NewTriple); NewTriple=OldTriple),
substitute(Var, Term, OldRest, NewRest), !.
substitute(Var, Term, [not(_)|OldRest], NewRest) :-
substitute(Var, Term, OldRest, NewRest), !.
sparqlTerm(X, X) :-
atomic(X),
string_concat('?', _, X), !.
sparqlTerm(X, X) :-
atomic(X),
string_concat(_, '*', X), !.
sparqlTerm(X, X) :-
atomic(X),
string_concat(_, '+', X), !.
sparqlTerm(literal(X), Term) :-
makeLiteral(X, Term), !.
sparqlTerm(X, Term) :-
\+X = literal(_),
rdf_global_id(X, URI),
atomic_list_concat(['<', URI, '>'], Term), !.
%makeLiteral(X, RDFLit) :-
% atomic_list_concat([Y, M, D], '-', X),
% atom_number(Y, Yn), atom_number(M, Mn), atom_number(D, Dn),
% 1900 < Yn, Yn < 2099, 0 < Mn, Mn < 13, 0< Dn, Dn <32, !,
% atomic_list_concat(['"', X, '"', '^^xsd:date'], RDFLit).
%makeLiteral(X, RDFLit) :-
% integer(X), !,
% atomic_list_concat(['"', X, '"', '^^xsd:integer'], RDFLit).
%makeLiteral(X, RDFLit) :-
% number(X),
% \+integer(X), !,
% atomic_list_concat(['"', X, '"', '^^xsd:double'], RDFLit).
makeLiteral(X, RDFLit) :-
atomic_list_concat(['"', X, '"'], RDFLit), !.
%%%%%%%%%%%%%%%%%%%%%
% URI generation
%%%%%%%%%%%%%%%%%%%%%
createFreshObject(TypeUri, Subject) :-
uuid(U),
rdf_current_prefix(_, Expansion),
atom_concat(Expansion, Local, TypeUri), !,
downcase_atom(Local, Name),
atomic_list_concat(['http://purl.bioontology.org/net/brunel/bm/', Name, '_', U], Subject).
createFreshObject(Type, Subject) :-
uuid(U),
downcase_atom(Type, Name),
atomic_list_concat(['http://purl.bioontology.org/net/brunel/bm/', Name, '_', U], Subject).
%%%%%%%%%%%%%%%%%%%%%%%
% Log
%%%%%%%%%%%%%%%%%%%%%%%
log_write(Content) :-
log_stream(Stream),
write(Stream, Content).
log_writeln(Content) :-
log_stream(Stream),
writeln(Stream, Content).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% utilities
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
label2URI(Label, URI) :-
string_codes(Label, LabCodes),
subst([32, 58], LabCodes, 95, NewCodes),
string_codes(Local, NewCodes),
string_concat('http://purl.bioontology.org/net/brunel/bm/', Local, URIstring),
atom_string(URI, URIstring).
subst(_, [], _, []) :- !.
subst(OldElems, [OldElem|RestOld], NewElem, [NewElem|RestNew]) :-
member(OldElem, OldElems),
subst(OldElems, RestOld, NewElem, RestNew), !.
subst(OldElems, [DiffElem|RestOld], NewElem, [DiffElem|RestNew]) :-
\+member(DiffElem, OldElems),
subst(OldElems, RestOld, NewElem, RestNew), !.
print_count100 :-
gensym('', Counter),
atom_number(Counter, Number),
0 is mod(Number, 100) -> writeln(Number); true.
print_count10 :-
gensym('', Counter),
atom_number(Counter, Number),
0 is mod(Number, 10) -> writeln(Number); true.