Daniel@0: /* Part of DML (Digital Music Laboratory) Daniel@0: Copyright 2014-2015 Samer Abdallah, University of London Daniel@0: Daniel@0: This program is free software; you can redistribute it and/or Daniel@0: modify it under the terms of the GNU General Public License Daniel@0: as published by the Free Software Foundation; either version 2 Daniel@0: of the License, or (at your option) any later version. Daniel@0: Daniel@0: This program is distributed in the hope that it will be useful, Daniel@0: but WITHOUT ANY WARRANTY; without even the implied warranty of Daniel@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Daniel@0: GNU General Public License for more details. Daniel@0: Daniel@0: You should have received a copy of the GNU General Public Daniel@0: License along with this library; if not, write to the Free Software Daniel@0: Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Daniel@0: */ Daniel@0: Daniel@0: :- module(backend_rdf, Daniel@0: [ rdf//3 Daniel@0: , in/5 Daniel@0: ]). Daniel@0: Daniel@0: :- use_module(library(semweb/rdf_db)). Daniel@0: :- use_module(library(semweb/turtle)). Daniel@0: :- use_module(library(semweb/rdf_turtle_write)). Daniel@0: :- use_module(library(dcg_core)). Daniel@0: Daniel@0: :- rdf_meta rdf(r,r,o,?,?). Daniel@0: rdf(S,P,O) --> [rdf(S,P,O)]. Daniel@0: Daniel@0: :- rdf_meta to_literal(+,o). Daniel@0: to_literal(integer(X), literal(type(xsd:integer,Y))) :- atom_number(Y,X). Daniel@0: to_literal(float(X), literal(type(xsd:float,Y))) :- atom_number(Y,X). Daniel@0: to_literal(double(X), literal(type(xsd:double,Y))) :- atom_number(Y,X). Daniel@0: to_literal(string(X), literal(type(xsd:string,Y))) :- atom_string(Y,X). Daniel@0: to_literal(atom(X),literal(X)). Daniel@0: Daniel@0: comp(Comp,Function,Input) --> Daniel@0: {once(to_literal(Input,InputLit))}, Daniel@0: rdf(Comp,dmlcla:function,literal(Function)), Daniel@0: rdf(Comp,dmlcla:input,InputLit). Daniel@0: Daniel@0: Daniel@0: inx(Triples,SS,PP,OO,_) :- Daniel@0: in(Triples,S,P,O,_), Daniel@0: rdf_global_id(S,SS), Daniel@0: rdf_global_id(P,PP), Daniel@0: rdf_global_object(O,OO). Daniel@0: Daniel@0: in(Triples,S,P,O,_) :- Daniel@0: number_vars_as_uris(Triples), Daniel@0: member(rdf(S,P,O),Triples). Daniel@0: Daniel@0: phrase_triple(Phrase,S,P,O,_) :- Daniel@0: phrase(Phrase,Triples), Daniel@0: number_vars_as_uris(Triples), Daniel@0: member(rdf(S,P,O),Triples). Daniel@0: Daniel@0: Daniel@0: :- meta_predicate python_rdf(//,-). Daniel@0: python_rdf(Input,Output) :- Daniel@0: phrase(Input,Triples), Daniel@0: number_vars_as_uris(Triples), Daniel@0: setup_call_cleanup( Daniel@0: process_create( dml('python/rdf_wrapper.py'),[], Daniel@0: [ cwd(dml(python)), process(PID), Daniel@0: stdin(pipe(ToScript)), stdout(pipe(FromScript))]), Daniel@0: ( call_cleanup(rdf_save_turtle(stream(ToScript),[expand(in(Triples)), silent(true)]), close(ToScript)), Daniel@0: rdf_read_turtle(stream(FromScript),Output,[base_uri('_:tmp#')]) Daniel@0: ), Daniel@0: (close(FromScript), process_wait(PID,Status)) Daniel@0: ), Daniel@0: debug(backend,'Process exit status was: ~q',[Status]). Daniel@0: Daniel@0: number_vars_as_uris(Term) :- Daniel@0: term_variables(Term,Vars), Daniel@0: seqmap(number_var_as_uri,Vars,1,_). Daniel@0: number_var_as_uri(Var,N,M) :- Daniel@0: atom_number(NN,N), Daniel@0: rdf_global_id(dmlcla:NN,Var), Daniel@0: succ(N,M).