예제 #1
0
def main_test():
    client = None
    try:
        space_name = 'space_' + threading.current_thread().getName()
        print('thread name: %s, space_name : %s' % 
                (threading.current_thread().getName(), space_name))
        # Get one client
        client = GraphClient(connection_pool)
        auth_resp = client.authenticate('user', 'password')
        if auth_resp.error_code:
            raise AuthException("Auth failed")

        query_resp = client.execute_query('SHOW SPACES')
        if has_space(query_resp.rows, space_name):
            print('has %s, drop it' % space_name)
            do_simple_execute(client, 'DROP SPACE %s' % space_name)

        # Create space mySpace
        do_simple_execute(client, 'CREATE SPACE %s'
                          % space_name)

        do_simple_execute(client, 'USE %s' % space_name)
        time.sleep(1)

        # Create tag and edge
        do_simple_execute(client, 'CREATE TAG person(name string, age int); '
                                  'CREATE EDGE like(likeness double)')

        # It should large than the cycle of loading the schema
        time.sleep(6)

        # Insert vertex and edge
        do_simple_execute(client, 'INSERT VERTEX person(name, age) VALUES 1:(\'Bob\', 10)')
        do_simple_execute(client, 'INSERT VERTEX person(name, age) VALUES 2:(\'Lily\', 9)')
        do_simple_execute(client, 'INSERT VERTEX person(name, age) VALUES 3:(\'Tom\', 10)')
        do_simple_execute(client, 'INSERT VERTEX person(name, age) VALUES 4:(\'Jerry\', 13);INSERT VERTEX person(name, age) VALUES 5:(\'John\', 11)')
        do_simple_execute(client, 'INSERT EDGE like(likeness) VALUES 1->2:(80.0)')
        do_simple_execute(client, 'INSERT EDGE like(likeness) VALUES 1->3:(70.0)')
        do_simple_execute(client, 'INSERT EDGE like(likeness) VALUES 2->4:(84.0), 3->5:(68.3), 1->5:(97.2)')

        # Query data
        query_resp = client.execute_query('GO FROM 1 OVER like YIELD $$.person.name, '
                                          '$$.person.age, like.likeness')
        if query_resp.error_code:
            print('Execute failed: %s' % query_resp.error_msg)
            exit(1)

        # Print the result of query
        print(' \n====== The query result of thread[%s]======\n '
              % threading.current_thread().getName())
        print_value(query_resp.column_names, query_resp.rows)
        client.sign_out()
    except Exception as x:
        print(x)

        client.sign_out()
        exit(1)
def test_response():
    client = GraphClient(connection_pool)
    auth_resp = client.authenticate('user', 'password')
    if auth_resp.error_code:
        raise AuthException("Auth failed")

    query_resp = client.execute_query('SHOW SPACES')
    do_simple_execute(client, 'use nba')
    query_resp = client.execute_query(
        'GO FROM 100 OVER follow,serve yield follow._dst,serve._dst')

    query_resp = client.execute_query('fetch prop on * 100')
    for row in query_resp.rows:
        for ids, col in enumerate(row.columns):
            print(col)
def nebula2networkx(client: GraphClient, nebula_space: str,
                    graph: nx.MultiDiGraph, vertex_list, edge_types):
    do_simple_execute(client, 'use ' + nebula_space)
    yield_statement = ",".join(
        [edge_type + "._dst" for edge_type in edge_types])
    seen_vertex = set()
    queue_vertex = []
    all_edges = {}
    for v in vertex_list:
        queue_vertex.insert(0, v)
    while len(queue_vertex):
        vertex = queue_vertex.pop()
        seen_vertex.add(vertex)
        get_edge_go_statement = "GO FROM {} OVER {} YIELD ".format(
            vertex, ','.join(edge_types)) + yield_statement
        edges_resp = client.execute_query(get_edge_go_statement)
        edges = [[] for _ in edge_types]
        if edges_resp.rows is not None:
            for row in edges_resp.rows:
                for ids, col in enumerate(row.columns):
                    if (col.getType()
                            == ttypes.ColumnValue.ID) and col.get_id() != 0:
                        edges[ids].append(col.get_id())
                        if col.get_id() not in seen_vertex:
                            seen_vertex.add(col.get_id())
                            queue_vertex.insert(0, col.get_id())
        all_edges[vertex] = edges
        # build networkX graph Node
        vertex_info_resp = fetch_info(client, "* " + str(vertex))
        vertex_info = handle_fetch_resp(vertex_info_resp)
        graph.add_node(vertex,
                       **vertex_info[0] if len(vertex_info) > 0 else {})

    # build networkX graph Edge
    for vertex_src, edges in all_edges.items():
        for edge_type_ids, vertexs_dst in enumerate(edges):
            if len(vertexs_dst) != 0:
                edge_info_fetch_statement = edge_types[
                    edge_type_ids] + ' ' + ','.join([
                        str(vertex_src) + "->" + str(dst)
                        for dst in vertexs_dst
                    ])

                edges_info = handle_fetch_resp(
                    fetch_info(client, edge_info_fetch_statement))
                graph.add_edges_from([(vertex_src, vertexs_dst[i],
                                       edges_info[i])
                                      for i in range(len(edges_info))])
예제 #4
0
def read_feats():
    g_ip = '192.168.8.188'
    g_port = 3699
    connection_pool = ConnectionPool(g_ip, g_port)
    client = GraphClient(connection_pool)
    auth_resp = client.authenticate('root', '')
    if auth_resp.error_code:
        raise AuthException("Auth failed")
    client.execute_query("use cora")
    query_resp = client.execute_query("LOOKUP ON paper WHERE paper.num > 0")
    num_nodes = len(query_resp.rows)
    labels = np.empty((num_nodes, 1), dtype=np.int64)
    label_map = {}

    query_resp = client.execute_query("fetch prop ON paper 1")
    feature_str = query_resp.rows[0].columns[2].get_str().decode().replace(
        ' ', '')
    feat_data = np.zeros((num_nodes, len(feature_str)))

    adj_lists = defaultdict(set)

    for i in range(num_nodes):
        query_resp = client.execute_query("fetch prop ON paper {}".format(i))
        feature_str = query_resp.rows[0].columns[2].get_str().decode()
        label = query_resp.rows[0].columns[3].get_str().decode()
        feature = np.fromstring(str(feature_str), dtype=int, sep=' ')
        feat_data[i] = feature
        if not label in label_map:
            label_map[label] = len(label_map)
        labels[i] = label_map[label]

        edge_query = client.execute_query("GO FROM {} OVER cite".format(i + 1))
        if edge_query.rows is None:
            continue
        for row in edge_query.rows:
            paperId = row.columns[0].get_id()
            adj_lists[i].add(int(paperId))
            adj_lists[int(paperId)].add(i)

    return feat_data, labels, adj_lists
class Generator(object):
    def __init__(self, ip, port):
        connection_pool = ConnectionPool(ip, port, 1, 0)
        self._client = GraphClient(connection_pool)
        self._client.authenticate('root', 'nebula')
        self._spaces = []
        self._stmts = []

    def start(self):
        self.generate_space_statment()
        self.generate_configs_statment()

    def generate_space_statment(self):
        resp = self.execute("SHOW SPACES;")

        for row in resp.rows:
            self._spaces.append(row.columns[0].get_str().decode('utf-8'))

        if len(self._spaces) == 0:
            return

        for space in self._spaces:
            self._stmts.append('\n')
            self._stmts.append(
                '#  ============ Space[{}] ========='.format(space))

            resp = self.execute("SHOW CREATE SPACE {};".format(space))
            self._stmts.append(
                resp.rows[0].columns[1].get_str().decode('utf-8').replace(
                    '\n', ''))
            self.execute("USE {};".format(space))

            self._stmts.append('USE {};'.format(space))

            self.generate_tag_statment()
            self.generate_edge_statment()
            self.generate_tag_index_statment()
            self.generate_edge_index_statment()

    def generate_tag_statment(self):
        resp = self.execute("SHOW TAGS;")

        tags = []
        for row in resp.rows:
            tags.append(row.columns[1].get_str().decode('utf-8'))

        if len(tags) == 0:
            return

        for tag in tags:
            resp = self.execute("SHOW CREATE TAG {};".format(tag))
            self._stmts.append(resp.rows[0].columns[1].get_str().decode(
                'utf-8').replace('\n', '') + ';')

    def generate_edge_statment(self):
        resp = self.execute("SHOW EDGES;")

        edges = []
        for row in resp.rows:
            edges.append(row.columns[1].get_str().decode('utf-8'))

        if len(edges) == 0:
            return

        for edge in edges:
            resp = self.execute("SHOW CREATE EDGE {};".format(edge))
            self._stmts.append(resp.rows[0].columns[1].get_str().decode(
                'utf-8').replace('\n', '') + ';')

    def generate_tag_index_statment(self):
        resp = self.execute("SHOW TAG INDEXES;")

        tag_indexes = []
        for row in resp.rows:
            tag_indexes.append(row.columns[1].get_str().decode('utf-8'))

        if len(tag_indexes) == 0:
            return

        for index in tag_indexes:
            resp = self.execute("SHOW CREATE TAG INDEX {};".format(index))
            self._stmts.append(resp.rows[0].columns[1].get_str().decode(
                'utf-8').replace('\n', '') + ';')

    def generate_edge_index_statment(self):
        resp = self.execute("SHOW EDGE INDEXES;")

        edge_indexes = []
        for row in resp.rows:
            edge_indexes.append(row.columns[1].get_str().decode('utf-8'))

        if len(edge_indexes) == 0:
            return

        for index in edge_indexes:
            resp = self.execute("SHOW CREATE EDGE INDEX {};".format(index))
            self._stmts.append(resp.rows[0].columns[1].get_str().decode(
                'utf-8').replace('\n', '') + ';')

    def generate_configs_statment(self):
        resp = self.execute("SHOW CONFIGS;")

        # moduleName, configName, value
        configs = []
        for row in resp.rows:
            module = row.columns[0].get_str().decode('utf-8')
            config = row.columns[1].get_str().decode('utf-8')
            col_val = row.columns[4]
            if col_val.getType() == ttypes.ColumnValue.BOOL_VAL:
                configs.append((module, config, col_val.get_bool_val()))
            elif col_val.getType() == ttypes.ColumnValue.INTEGER:
                configs.append((module, config, col_val.get_integer()))
            elif col_val.getType() == ttypes.ColumnValue.STR:
                configs.append(
                    (module, config, col_val.get_str().decode('utf-8').replace(
                        '\n', '').replace(':', '=').replace('"', '') + ';'))
            elif col_val.getType() == ttypes.ColumnValue.DOUBLE_PRECISION:
                configs.append(
                    (module, config, col_val.get_double_precision()))
            else:
                print("ERROR: Config {}:{} type `{}' unsupported".format(
                    module, config, col_val, col_val.getType()))
                exit(1)

        if len(configs) == 0:
            return

        self._stmts.append('\n')
        self._stmts.append('#  ============ Configs =========')
        for config in configs:
            self._stmts.append('UPDATE CONFIGS {}:{} = {}'.format(
                config[0], config[1], config[2]))

    def execute(self, stmt):
        resp = self._client.execute_query(stmt)
        if resp.error_code != ttypes.ErrorCode.SUCCEEDED:
            print("Execute `SHOW SPACES' failed: ".format(resp.error_msg))
            exit(1)
        return resp

    def print(self):
        for stmt in self._stmts:
            print(stmt)

    def save_to_file(self):
        f = open(statement_file, 'w')
        for stmt in self._stmts:
            f.write(stmt + '\n')
        f.close()
        print('The generated nGQLs file is ./{}'.format(statement_file))
예제 #6
0
def fetch_info(client: GraphClient, key: str):
    return client.execute_query("FETCH PROP ON " + key)
예제 #7
0
def verify_nebula(client: GraphClient, datas: list, conf):
    nebula_space = conf.get_string("nebula.space")
    do_simple_execute(client, 'use ' + nebula_space)
    batch_size = 50
    full_conf = HandleConf(conf)
    json_vertex_data = {}
    json_edge_data = {}
    for data in datas:
        for tag_name, vertices in data["vertex"].items():
            json_vertex_data[tag_name] = vertices["data"]
        for edge_name, edge in data["edge"].items():
            json_edge_data[edge_name] = edge["data"]
    for tag_name, tag_conf in full_conf.tag_data.items():
        logger.info("verify tag:" + tag_name)
        data = json_vertex_data[tag_name]
        query = 'fetch prop on {} '.format(tag_name)
        ids = 0
        while ids < len(data):
            _ = 0
            batch_ids = []
            search_map = {}
            while _ < batch_size and ids < len(data):
                batch_ids.append(str(data[ids][tag_conf.id_field]))
                search_map[str(data[ids][tag_conf.id_field])] = data[ids]
                ids += 1
                _ += 1
            exec_query = query + ','.join(batch_ids)
            logger.info("nebula exec: " + exec_query)

            query_resp = client.execute_query(exec_query)
            if query_resp.error_code != 0:
                logger.error("resp msg:" + query_resp.error_msg)
            else:
                nebula_datas = handle_fetch_resp(query_resp)
                if len(batch_ids) != len(nebula_datas):
                    logger.error("search length:{}, real length:{}".format(
                        len(batch_ids), len(nebula_datas)))
                for nebula_data in nebula_datas:
                    json_data = search_map[str(nebula_data[str(
                        tag_conf.id_field)])]
                    for field in tag_conf.fields:
                        if nebula_data[field] != json_data[field]:
                            logger.error(
                                "json data:{} , nebula data:{} , field:{}, json value:{}, nebula value: {}",
                                json_data, nebula_data, field,
                                json_data[field], nebula_data[field])

    def trim_edge_id(x):
        return x if '.' not in x else x.split('.')[1]

    for edge_name, edge_conf in full_conf.edge_data.items():
        logger.info("verify edge:" + edge_name)
        query = 'fetch prop on {} '.format(edge_name)
        data = json_edge_data[edge_name]
        for json_data in data:

            edge_id = edge_conf.get_id(
                json_data['from']['match'][trim_edge_id(edge_conf.from_field)],
                json_data['to']['match'][trim_edge_id(edge_conf.to_field)],
                0 if edge_conf.ranking == '' else
                json_data['data'][edge_conf.ranking])

            exec_query = query + edge_id
            logger.info("nebula exec: " + exec_query)

            query_resp = client.execute_query(exec_query)
            if query_resp.error_code != 0:
                logger.error("resp msg: " + query_resp.error_msg)
            else:
                nebula_datas = handle_fetch_resp(query_resp)
                if len(nebula_datas) != 1:
                    logger.error("nebula data:{}, json_data:{}".format(
                        nebula_datas, json_data))
                else:
                    nebula_data = nebula_datas[0]
                    for field in edge_conf.fields:
                        if field not in nebula_data:
                            logger.error("field:{} not in nebula data{}",
                                         field, nebula_data)
                        if nebula_data[field] != json_data['data'][field]:
                            logger.error(
                                "json data:{} , nebula data:{} , field:{}, json value:{}, nebula value: {}",
                                json_data, nebula_data, field,
                                json_data[field], nebula_data[field])
                    if edge_conf.ranking != '':
                        if nebula_data['_rank'] != json_data['data'][
                                edge_conf.ranking]:
                            logger.error(
                                "rank field {}, nebula rank {}, json rank {}".
                                format(edge_conf.ranking, nebula_data['_rank'],
                                       json_data['data'][edge_conf.ranking]))