2016-04-12 10 views
0

In der Dokumentation verwenden die ETL von CSV eine zu viele Funktion, ich möchte es auf viele zu vielen erweitern. Also habe ich 3 Konfigurationen gemacht, eine für Post, eine für Kommentar und eine für Relation. Post und Comment sind in Ordnung, aber wenn ich Relation starte, habe ich diesen Fehler, was mache ich falsch?etl und viele zu viele Beziehung

commentId,postId 
    0,10 
    1,10 
    21,10 
    41,20 
    82,20  

    { 
    "source": { "file": { "path": "/tmp/relation.csv" } }, 
    "extractor": { "csv": {} }, 
     "transformers": [ 
     { "edge": 
      { "class": "HasComments", "joinFieldName": "postId", "lookup": "Post.id", "direction": "out"}, 
      { "class": "HasComments", "joinFieldName": "commentId", "lookup": "Comment.id", "direction": "in"} 
     } 
     ], 
     "loader": { 
     "orientdb": { 
      "dbURL": "plocal:/tmp/test", 
      "dbType": "graph", 
      "classes": [ 
      {"name": "Post", "extends": "V"}, 
      {"name": "Comment", "extends": "V"}, 
      {"name": "HasComments", "extends": "E"} 
      ], 
      "indexes": [ 
      {"class":"Post", "fields":["id:integer"], "type":"UNIQUE" }, 
      {"class":"Comment", "fields":["id:integer"], "type":"UNIQUE" } 
      ] 
     } 
     } 
    } 

    OrientDB etl v.2.1.9-SNAPSHOT (build [email protected]; 2016-01-07 10:51:24+0000) www.orientdb.com 
    BEGIN ETL PROCESSOR 
    [file] INFO Reading from file /tmp/relation.csv with encoding UTF-8 
    Error in Pipeline execution: com.orientechnologies.orient.etl.transformer.OTransformException: edge: input type '[email protected]e7e3' is not supported 
    ETL process halted: com.orientechnologies.orient.etl.OETLProcessHaltedException: Halt 
    Exception in thread "main" com.orientechnologies.orient.etl.OETLProcessHaltedException: Halt 
    at com.orientechnologies.orient.etl.OETLPipeline.execute(OETLPipeline.java:149) 
    at com.orientechnologies.orient.etl.OETLProcessor.executeSequentially(OETLProcessor.java:448) 
    at com.orientechnologies.orient.etl.OETLProcessor.execute(OETLProcessor.java:255) 
    at com.orientechnologies.orient.etl.OETLProcessor.main(OETLProcessor.java:109) 
    Caused by: com.orientechnologies.orient.etl.transformer.OTransformException: edge: input type '[email protected]e7e3' is not supported 
    at com.orientechnologies.orient.etl.transformer.OEdgeTransformer.executeTransform(OEdgeTransformer.java:107) 
    at com.orientechnologies.orient.etl.transformer.OAbstractTransformer.transform(OAbstractTransformer.java:37) 
    at com.orientechnologies.orient.etl.OETLPipeline.execute(OETLPipeline.java:115) 
    ... 3 more 
+0

viele zu viele für Ihre Beziehung eine Funktion in JavaScript besteht zu überprüfen, ich tue. Welche Version von OrientDb verwenden Sie? –

Antwort

0

Eine mögliche Lösung könnte darin bestehen, nach der Post und Comment Klassen durch ihre JSON-Datei importieren, können Sie eine andere JSON-Datei verwenden, und importieren Sie die Klasse Relation

{ 
    "source": { "file": { "path": "/tmp/relation.csv" } }, 
    "extractor": { "row": {} }, 
    "transformers": [ 
     { "csv": { "separator": ","} 
     }, 
     { "vertex": { "class": "Relation" } } 
    ], 
    "loader": { 
     "orientdb": { 
      "dbURL": "plocal:/tmp/test", 
      "dbType": "graph", 
      "classes": [ 
       {"name": "Post", "extends": "V"}, 
       {"name": "Comment", "extends": "V"}, 
       {"name": "Relation", "extends": "V"}, 
       {"name": "HasComments", "extends": "E"} 
      ], 
      "indexes": [ 
       {"class":"Post", "fields":["id:integer"], "type":"UNIQUE" }, 
       {"class":"Comment", "fields":["id:integer"], "type":"UNIQUE" } 
      ] 
     } 
    } 
} 

Sie werden diese Aufzeichnungen erhalten.

enter image description here

mit dem folgenden JavaScript-Funktion

var g=orient.getGraphNoTx(); 
var relation = g.command("sql","select from Relation"); 
for(i=0;i<relation.length;i++){ 
var relationMM=g.command("sql","select postId , commentId from "+ relation[i].getId()); 
var idPost=relationMM[0].getProperty("postId"); 
var idComment=relationMM[0].getProperty("commentId"); 
var post=g.command("sql","select from Post where id = " + idPost); 
var comment=g.command("sql","select from Comment where id = " + idComment); 
g.command("sql","create edge HasComments from " + post[0].getId() + " to " + comment[0].getId()); 
} 
g.command("sql","drop class Relation unsafe"); 

Sie werden die folgende Struktur erhalten.

enter image description here

Dies wird Ihr Graph.

enter image description here

UPDATE

Sie diesen Code verwenden können, bereits wenn der Rand

var counter=g.command("sql","select count(*) from HasComments where out=" + post[0].getId() + " and in=" + comment[0].getId()); 
if(counter[0].getProperty("count")==0){ 
    g.command("sql","create edge HasComments from " + post[0].getId() + " to " + comment[0].getId()); 
} 
+0

Vielen Dank funktioniert super! Aber wenn ich jetzt testen möchte, ob die Kante vorhanden ist, bevor ich sie per Skript erstelle, wie kann ich dann eine Einschränkung hinzufügen? Weil ich ETL verwenden möchte, um täglich neue Scheitelpunkte und Kanten aus der Primärdatenbank hinzuzufügen, und jetzt, wenn ich das Funktionsskript zweimal öffne, habe ich doppelte Kanten – jrweb247

+0

@ jrweb247 Ich arbeite daran und lasse Sie dann wissen –

+0

wenn ich ein "g. Befehl ("sql", "Kante löschen HasComments from" + post [0] .getId() + "to" + Kommentar [0] .getId()); " kurz vor dem Erstellen funktioniert es, weil das Löschen im Hintergrund fehlgeschlagen ist – jrweb247