vesoft-inc/nebula

Generate schema for NebulaGraph from MySQL sources

Open

#5,728 opened on Sep 26, 2023

View on GitHub
 (3 comments) (2 reactions) (0 assignees)C++ (1,144 forks)batch import
hacktoberfesttype/feature req

Repository metrics

Stars
 (9,828 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

Given table DDLs and a sample set of queries from a MySQL database, generate a corresponding graph model for NebulaGraph consisting of DDLs of graphs, vertices and edges, as well as a sample set of nGQL queries that would do the same job as those in the MySQL database.

Example:

Given the following DDLs from the TPC-H benchamrk,

CREATE TABLE part  ( 
    P_PARTKEY     INTEGER primary key,
    P_NAME        VARCHAR(55) NOT NULL,
    P_MFGR        CHAR(25) NOT NULL,
    P_BRAND       CHAR(10) NOT NULL,
    P_TYPE        VARCHAR(25) NOT NULL,
    P_SIZE        INTEGER NOT NULL,
    P_CONTAINER   CHAR(10) NOT NULL,
    P_RETAILPRICE DECIMAL(15,2) NOT NULL,
    P_COMMENT     VARCHAR(23) NOT NULL 
);

CREATE TABLE supplier  ( 
    S_SUPPKEY     INTEGER primary key,
    S_NAME        CHAR(25) NOT NULL,
    S_ADDRESS     VARCHAR(40) NOT NULL,
    S_NATIONKEY   INTEGER NOT NULL,
    S_PHONE       CHAR(15) NOT NULL,
    S_ACCTBAL     DECIMAL(15,2) NOT NULL,
    S_COMMENT     VARCHAR(101) NOT NULL
);

CREATE TABLE partsupp  ( 
    PS_PARTKEY INTEGER NOT NULL,
    PS_SUPPKEY     INTEGER NOT NULL,
    PS_AVAILQTY    INTEGER NOT NULL,
    PS_SUPPLYCOST  DECIMAL(15,2)  NOT NULL,
    PS_COMMENT     VARCHAR(199) NOT NULL, primary key (ps_partkey, ps_suppkey) 
);

we may create tags in the NebulaGraph like the following:

CREATE TAG IF NOT EXISTS part (
    P_NAME        FIXED_STRING(55) NOT NULL,
    P_MFGR        FIXED_STRING(25) NOT NULL,
    P_BRAND       FIXED_STRING(10) NOT NULL,
    P_TYPE        FIXED_STRING(25) NOT NULL,
    P_SIZE        INT32 NOT NULL,
    P_CONTAINER   FIXED_STRING(10) NOT NULL,
    P_RETAILPRICE FLOAT NOT NULL,
    P_COMMENT     FIXED_STRING(23) NOT NULL 
);

CREATE TAG IF NOT EXISTS supplier(
    S_NAME        STRING NOT NULL,
    S_ADDRESS     FIXED_STRING(40) NOT NULL,
    S_NATIONKEY   INT16 NOT NULL,
    S_PHONE       FIXED_STRING(15) NOT NULL,
    S_ACCTBAL     FLOAT NOT NULL,
    S_COMMENT     FIXED_STRING(101) NOT NULL);
);

and an edge type indicating the relationship of 'supply' like this:

CREATE EDGE IF NOT EXISTS supply(
    PS_AVAILQTY   INT64 NOT NULL,
    PS_SUPPLYCOST FLOAT NOT NULL,
    PS_COMMENT    FIXED_STRING(199) NOT NULL 
);

In this example, PKs and their coresponding unique identifiers (i.e., vertex IDs) have been omitted. The idea is to create tags for vertices to work like fact tables and to create edges to replace join-like operations or tables storing relationships.

Contributor guide