Exemplo n.º 1
0
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
Exemplo n.º 2
0
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()
Exemplo n.º 3
0
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