def get_fragment_graph(fid): if not r.sismember('{}:fragments'.format(AGENT_ID), fid): raise NotFound('The fragment {} does not exist'.format(fid)) lock = fragment_lock(fid) lock.acquire() try: response = make_response(fragment_graph(fid).serialize(format='turtle')) response.headers['Content-Type'] = 'text/turtle' finally: lock.release() return response
def get_fragment(**kwargs): fid = kwargs['id'] lock = fragment_lock(fid) lock.acquire() try: updated = r.get('{}:fragments:{}:updated'.format(AGENT_ID, fid)) if updated: kwargs['last_updated'] = updated kwargs['triples'] = len(fragment_graph(fid)) pulling = r.get('{}:fragments:{}:pulling'.format(AGENT_ID, fid)) kwargs['pulling'] = False if pulling is None else eval(pulling) return kwargs finally: lock.release()
def _query(fid, gp): """ Query the fragment using the original request graph pattern :param gp: :param fid: :return: The query result """ def __build_query_from(x, depth=0): def build_pattern_query((u, v, data)): return '\nOPTIONAL { %s %s %s %s }' % (u, data['predicate'], v, __build_query_from(v, depth + 1)) out_edges = list(gp_graph.out_edges_iter(x, data=True)) out_edges = reversed(sorted(out_edges, key=lambda x: gp_graph.out_degree)) if out_edges: return ' '.join([build_pattern_query(x) for x in out_edges]) return '' gp_parts = [tp_parts(tp) for tp in gp] blocks = [] gp_graph = nx.DiGraph() for gp_part in gp_parts: gp_graph.add_edge(gp_part[0], gp_part[2], predicate=gp_part[1]) roots = filter(lambda x: gp_graph.in_degree(x) == 0, gp_graph.nodes()) blocks += ['%s a stoa:Root\nOPTIONAL { %s }' % (root, __build_query_from(root)) for root in roots] where_gp = ' .\n'.join(blocks) q = """SELECT DISTINCT * WHERE { %s }""" % where_gp result = [] try: log.info('Querying fragment {}:\n{}'.format(fid, q)) result = fragment_graph(fid).query(q) except Exception as e: # ParseException from query traceback.print_exc() log.warning(e.message) return result