""" Requires a neoplasmer service to run See README.md """ import sys from pengines.Builder import PengineBuilder from pengines.Pengine import Pengine from prologterms import TermGenerator, PrologRenderer, Program, Var P = TermGenerator() MatchID = Var('MatchID') Score = Var('Score') Prefix = Var('Prefix') R = PrologRenderer() #terms = ['neoplasm', 'glioma', 'astrocytoma'] terms = sys.argv[1:] for t in terms: q = P.term_best_match(t, MatchID, Score, Prefix) factory = PengineBuilder(urlserver="http://localhost:9055", ask=R.render(q)) pengine = Pengine(builder=factory, debug=False) while pengine.currentQuery.hasMore: pengine.doNext(pengine.currentQuery) for p in pengine.currentQuery.availProofs: print('Term: {} Match: {} {}'.format(t, p[MatchID.name], p[Score.name]))
class SPARQLProg(): """ Wrapper for pengines to call a SPARQLProg service """ def __init__(self, server=DEFAULT_SERVER, endpoint=None, rules=None, program=None): self.server = server self.endpoint = endpoint self.rules = rules self.renderer = PrologRenderer() if program is not None: if type(program) is not str: program = self.renderer.render(program) self.program = program def query_to_dataframe(self, q, select=None, **args): """ As query(), but returns a pandas dataframe """ items = [] for r in self.query(q, select=select, **args): items.append(r.toDict()) df = pd.DataFrame(items) return df def query(self, q, select=None, endpoint=None): """ Query a sparqlprog endpoint Returns: iterator """ P = TermGenerator() opts = [] if self.rules is not None: # force a tuple opts = [P.rule( (r,) ) for r in self.rules] opts_str = self.renderer.render(opts) if select is None: select = q if select is not str: select = self.renderer.render(select) if type(q) is not str: q = self.renderer.render(q) if endpoint is None: endpoint = self.endpoint if endpoint is not None: q = f"'??'({endpoint}, ({q}), ({select}), {opts_str})" logging.info(f"Query={q}") logging.info(f"Program={self.program}") builder = PengineBuilder(urlserver=self.server, destroy=False, srctext=self.program, ask=q) pengine = Pengine(builder=builder, debug=False) # note: may be rewritten after this is fixed and pushed to pypi: # https://github.com/ian-andrich/PythonPengines/issues/14 if pengine.currentQuery is not None: for r in pengine.currentQuery.availProofs: yield self._translate(r) pengine.currentQuery.availProofs = [] # reset n=0 while pengine.currentQuery is not None and pengine.currentQuery.hasMore: n += 1 logging.info(f"Next chunk={n}") pengine.doNext(pengine.currentQuery) if pengine.currentQuery is not None: for r in pengine.currentQuery.availProofs: yield self._translate(r) pengine.currentQuery.availProofs = [] # reset def _translate(self, term): if type(term) == dict: if 'args' in term and 'functor' in term: if term['functor'] == 'literal': return self._translate_literal(term['args'][0]) else: for k,v in term.items(): v = self._translate(v) term[k] = v return DotMap(term) else: return term def _translate_literal(self, v): if type(v) == dict: if v['functor'] == 'lang': args = v['args'] return Literal(args[1], lang=args[0]) else: return v
from pengines.Builder import PengineBuilder from pengines.Pengine import Pengine from prologterms import TermGenerator, PrologRenderer, Program, Var P = TermGenerator() X = Var('X') Y = Var('Y') Z = Var('Z') R = PrologRenderer() p = Program( P.ancestor(X,Y) <= (P.parent(X,Z), P.ancestor(Z,Y)), P.ancestor(X,Y) <= P.parent(X,Y), P.parent('a','b'), P.parent('b','c'), P.parent('c','d') ) q = P.ancestor(X,Y) factory = PengineBuilder(urlserver="http://localhost:4242", srctext=R.render(p), ask=R.render(q)) pengine = Pengine(builder=factory, debug=True) while pengine.currentQuery.hasMore: pengine.doNext(pengine.currentQuery) for p in pengine.currentQuery.availProofs: print('{} <- {}'.format(p[X.name], p[Y.name]))