ORIENT ETL 多对多

ORIENT ETL many to many

M:M

的 ETL

我们在 RDBMS 中有以下 tables:

  1. ExternalMessageConfig (id,name,...);
  2. ExternalMessageDataConfig (id,dataname,...);
  3. ExternalMessageConfigMapping (messageConfigId,dataConfigId) (M:M) (Link table).

我们创建了 2 个顶点:ExternalMessageConfig 和 ExternalMessageDataConfig。

我们在 ExternalMessageConfig 中创建了:out_ExternalMessageDataConfigTYPE LINKLIST 以填充 ExternalMessageDataConfig。

问题:

或者

东方数据库版本:2.0.13

目标是:一旦您将 tables 从 RDBMS 导入到 OrientDB(通过 ETL 工具),以下脚本允许您在具有许多的各种实体之间创建 links-对多关系(目前 ETL 无法实现)。

默认场景涉及以下步骤/条件:

1) 运行 ETL 导入 3 tables: Table 1 (left_table), Table 2 (right_table), Table 3 (mm-table 包含关系 m: n 的 id)

2) 在orient数据库中会有3个class包含数据

3) 运行 代码将创建连接 left_table -> table_right 的边,取消 mm-table 现在无用 class ,取消 left_table 和 right_table 的字段 'id' 因为在 OrientDB 中不需要 ID。

JAVA脚本

Function with parameters: "leftTable" , "rightTable" , "mmTable" , "nameIdLeft" , "nameIdRight" , "nameEdge"

var g=orient.getGraphNoTx();
g.command("sql","CREATE CLASS " + nameEdge + " EXTENDS E");
var MM_table = g.command("sql","select from " + mmTable);
for(i=0;i<MM_table.length;i++){
var recordMM=g.command("sql","select " + nameIdLeft + " , " + nameIdRight + " from "+ MM_table[i].getId());
var idLeft=recordMM[0].getProperty(nameIdLeft);
var idRight=recordMM[0].getProperty(nameIdRight);
var left=g.command("sql","select from " + leftTable + " where " + nameIdLeft + " = " + idLeft);
var right=g.command("sql","select from " + rightTable + " where " + nameIdRight + " = " + idRight);
g.command("sql","create edge Left_Right from " + left[0].getId() + " to " + right[0].getId());
}
g.command("sql","drop class " + mmTable + " unsafe");
g.command("sql","UPDATE " + leftTable + " REMOVE " + nameIdLeft);
g.command("sql","UPDATE " + rightTable + " REMOVE " + nameIdRight);

工作室来电:

select myFunction("Animal","Person","MMtable","idAnimal","idPerson","Left_Right")

JAVA

public class ManyToMany {

    static final String REMOTE      = "remote:localhost/";
    static final String NOMEDB      = "MoltiAmolti";
    static final String CURRENTPATH = REMOTE + NOMEDB;

    public static void main(String[] args) throws IOException {

        OServerAdmin serverAdmin = new OServerAdmin(CURRENTPATH).connect("root", "root");

        OrientGraphNoTx g = new OrientGraphFactory(CURRENTPATH).getNoTx();

        createEdgeManyToMany(g, "Animal", "Person", "mmTable", "idAnimal", "idPerson", "Left_Right");
    }


    public static void createEdgeManyToMany (OrientGraphNoTx  g, String leftTable, String rightTable, String mmTable, 
                         String nameIdLeft, String nameIdRight, String nameEdge){

        System.out.println("Start processing...");

        //query on mmTable to save 2 id
        String getMMvertex = "select from "+mmTable;
        Iterable<Vertex> mm_vertex = g.command(new OSQLSynchQuery<Vertex>(getMMvertex)).execute();
        List<OrientVertex> listaVertex = new ArrayList<OrientVertex>();
        CollectionUtils.addAll(listaVertex, mm_vertex.iterator());

        //for each record
        String idLeft = ""; 
        String idRight = "";
        Iterable<Vertex> vertexLeft;
        Iterable<Vertex> vertexRight;
        String queryGetLeft = "";
        String queryGetRight = "";
        String queryEdge = "";
        String tmpIdleft = "";
        String tmpIdRight = "";

        //create class edge
        OClass edge = g.createEdgeType(nameEdge, "E");

        for (int i = 0; i<listaVertex.size(); i++) {
            System.out.println("Record Many-to-Many n°"+(i+1));
            idLeft = listaVertex.get(i).getProperty(nameIdLeft).toString();
            idRight = listaVertex.get(i).getProperty(nameIdRight).toString();

            queryGetLeft = "SELECT FROM " + leftTable + " WHERE " + nameIdLeft + " = " + idLeft;
            vertexLeft = g.command(new OCommandSQL(queryGetLeft)).execute();

            queryGetRight = "SELECT FROM " + rightTable + " WHERE " + nameIdRight + " = " + idRight;
            vertexRight = g.command(new OCommandSQL(queryGetRight)).execute();

            //create edge from vertex-left to vertex-right
            tmpIdleft = vertexRight.iterator().next().getId().toString();
            tmpIdRight = vertexLeft.iterator().next().getId().toString();
            queryEdge = "CREATE EDGE "+nameEdge+" FROM "+tmpIdleft+" TO "+tmpIdRight;
            g.command(new OCommandSQL(queryEdge)).execute();

            System.out.println("   - Created edge: "+queryEdge);
        }

        //remove id from origin vertex now useless
        g.command(new OCommandSQL("DROP PROPERTY "+leftTable+"."+nameIdLeft+" FORCE")).execute();
        g.command(new OCommandSQL("UPDATE "+leftTable+" REMOVE "+nameIdLeft+"")).execute();
        g.command(new OCommandSQL("DROP PROPERTY "+rightTable+"."+nameIdRight+" FORCE")).execute();
        g.command(new OCommandSQL("UPDATE "+rightTable+" REMOVE "+nameIdRight+"")).execute();
        System.out.println("Update old vertex eliminating id fields");
        g.command(new OCommandSQL("DROP class "+mmTable+" unsafe")).execute();
        System.out.println("Remove class many-to-many");

        System.out.println("End!"); 
        g.shutdown();
    }
}

编辑

'WHITOUT EDGE BUT WITH LINKLIST'

好的,那么你想要的结果应该是这样的:

代码没有太大变化,不同的是在LeftTable中添加了Linklist属性,并创建了link指向rightTable.

JAVA 变化

public static void createEdgeManyToMany (OrientGraphNoTx  g, String leftTable, String rightTable, String mmTable, 
                                  String nameIdLeft, String nameIdRight, String link) {

    System.out.println("Start processing...");

    //query on mmTable to save 2 id
    String getMMvertex = "select from "+mmTable;
    Iterable<Vertex> mm_vertex = g.command(new OSQLSynchQuery<Vertex>(getMMvertex)).execute();
    List<OrientVertex> listaVertex = new ArrayList<OrientVertex>();
    CollectionUtils.addAll(listaVertex, mm_vertex.iterator());

    //for each record
    String idLeft = ""; 
    String idRight = "";
    Iterable<Vertex> vertexLeft;
    Iterable<Vertex> vertexRight;
    String queryGetLeft = "";
    String queryGetRight = "";
    String queryEdge = "";
    String tmpIdleft = "";
    String tmpIdRight = "";
    String queryLink = "";
    boolean created = false;

    for (int i = 0; i<listaVertex.size(); i++) {
        System.out.println("Record Many-to-Many n°"+(i+1));
        idLeft = listaVertex.get(i).getProperty(nameIdLeft).toString();
        idRight = listaVertex.get(i).getProperty(nameIdRight).toString();

        queryGetLeft = "SELECT FROM " + leftTable + " WHERE " + nameIdLeft + " = " + idLeft;
        vertexLeft = g.command(new OCommandSQL(queryGetLeft)).execute();

        queryGetRight = "SELECT FROM " + rightTable + " WHERE " + nameIdRight + " = " + idRight;
        vertexRight = g.command(new OCommandSQL(queryGetRight)).execute();

        //create edge from vertex-left to vertex-right
        tmpIdleft = vertexLeft.iterator().next().getId().toString();
        tmpIdRight = vertexRight.iterator().next().getId().toString();

        //add in the schema class the property link
        if (!created) {
            OClass leftTableClass = g.getRawGraph().getMetadata().getSchema().getClass(leftTable);
            OClass rightTableclass = g.getRawGraph().getMetadata().getSchema().getClass(rightTable);
            leftTableClass.createProperty(link, OType.LINKLIST, rightTableclass);
            created = true;
        }

        //without edge but with link
        queryLink = "update "+tmpIdleft+" ADD "+link+" = "+tmpIdRight;
        g.command(new OCommandSQL(queryLink)).execute();

        System.out.println("   - Created link: "+queryLink);
    }
    //remove id from origin vertex now useless
    g.command(new OCommandSQL("DROP PROPERTY "+leftTable+"."+nameIdLeft+" FORCE")).execute();
    g.command(new OCommandSQL("UPDATE "+leftTable+" REMOVE "+nameIdLeft+"")).execute();
    g.command(new OCommandSQL("DROP PROPERTY "+rightTable+"."+nameIdRight+" FORCE")).execute();
    g.command(new OCommandSQL("UPDATE "+rightTable+" REMOVE "+nameIdRight+"")).execute();
    System.out.println("Update old vertex eliminating id fields");
    g.command(new OCommandSQL("DROP class "+mmTable+" unsafe")).execute();
    System.out.println("Remove class many-to-many");

    System.out.println("End!"); 
    g.shutdown();
}

JAVA脚本更改

参数: leftTable,rightTable,mmTable,nameIdLeft,nameIdRight,nameLink

var g=orient.getGraphNoTx();
g.command("sql","CREATE PROPERTY " + leftTable + "." + nameLink + " linklist " + rightTable);
var MM_table = g.command("sql","select from " + mmTable);
for(i=0;i<MM_table.length;i++){
    var recordMM=g.command("sql","select " + nameIdLeft + " , " + nameIdRight + " from "+ MM_table[i].getId());
    var idLeft=recordMM[i].getProperty(nameIdLeft);
    var idRight=recordMM[i].getProperty(nameIdRight);
    var left=g.command("sql","select from " + leftTable + " where " + nameIdLeft + " = " + idLeft);
    var right=g.command("sql","select from " + rightTable + " where " + nameIdRight + " = " + idRight);
    g.command("sql","update " + left[0].getId() + " add " + nameLink + " = [ " + right[0].getId()+ " ]");
}
g.command("sql","drop class " + mmTable + " unsafe");
g.command("sql","UPDATE " + leftTable + " REMOVE " + nameIdLeft);
g.command("sql","UPDATE " + rightTable + " REMOVE " + nameIdRight);