2017-03-27 2 views
1

j'ai des données que je suis suivi qui ressemble à quelque chose comme ceci:OrientDB créer ETL bord en utilisant plusieurs champs dans les critères de match

node.csv
Label1,Label2 
Alpha,A 
Alpha,B 
Alpha,C 
Bravo,A 
Bravo,B 

La paire Label1 et Label2 définissent une entrée unique cet ensemble de données.

j'ai une autre table qui a des valeurs dans ce que je veux créer un lien vers les sommets créés dans Table1:

data.csv
Label1,Label2,Data 
Alpha,A,10 
Alpha,A,20 
Alpha,B,30 
Bravo,A,99 

Je voudrais générer des bords à partir des entrées Data à Node lorsque les champs Label1 et Label2 correspondent dans chacun.

Dans ce cas, je dois:

Data(Alpha,A,10) ---> Node(Alpha,A) 
Data(Alpha,A,20) ---> Node(Alpha,A) 
Data(Alpha,B,30) ---> Node(Alpha,B) 
Data(Bravo,A,99) ---> Node(Bravo,A) 

Dans un autre question il semble que cette question se résout en ajoutant simplement une entrée « joinFieldName » supplémentaire dans le fichier JSON, mais je ne reçois pas le même résultat avec mes données.

Mon fichier node.json ressemble:

{ 
    "config": { "log": "info" }, 
    "source": { "file": { "path": "./node.csv" } }, 
    "extractor": { "csv": {} }, 
    "transformers": [ { "vertex": { "class": "Node" } } ], 
    "loader": { 
     "orientdb": { 
      "dbURL": "plocal:test.orientdb", 
      "dbType": "graph", 
      "batchCommit": 1000, 
      "classes": [ {"name": "Node", "extends": "V"} ], 
      "indexes": [] 
     } 
    } 
} 

et mon fichier data.json ressemble à ceci:

{ 
    "config": { "log": "info" }, 
    "source": { "file": { "path": "./data.csv" } }, 
    "extractor": { "csv": { } }, 
    "transformers": [ 
      { "vertex": { "class": "Data" } }, 
      { "edge": { "class":   "Source", 
          "joinFieldName": "Label1", 
          "lookup":  "Node.Label1", 
          "joinFieldName": "Label2", 
          "lookup":  "Node.Label2", 
          "direction":  "in" 
         } 
      } 
     ], 
    "loader": { 
     "orientdb": { 
      "dbURL": "plocal:test.orientdb", 
      "dbType": "graph", 
      "batchCommit": 1000, 
      "classes": [ {"name": "Data", "extends": "V"}, 
         {"name": "Source", "extends": "E"} 
         ], 
      "indexes": [] 
     } 
    } 
} 

Après avoir couru ces derniers, je reçois cette sortie quand je fais une recherche le résultat :

orientdb {db=test.orientdb}> SELECT FROM V 

+----+-----+------+------+------+-------------------+----+-------------+ 
|# |@RID |@CLASS|Label1|Label2|out_Source   |Data|in_Source | 
+----+-----+------+------+------+-------------------+----+-------------+ 
|0 |#25:0|Node |Alpha |A  |[#41:0,#43:0,#47:0]| |    | 
|1 |#26:0|Node |Alpha |B  |[#45:0]   | |    | 
|2 |#27:0|Node |Alpha |C  |     | |    | 
|3 |#28:0|Node |Bravo |A  |[#42:0,#44:0,#48:0]| |    | 
|4 |#29:0|Node |Bravo |B  |[#46:0]   | |    | 
|5 |#33:0|Data |Alpha |A  |     |10 |[#41:0,#42:0]| 
|6 |#34:0|Data |Alpha |A  |     |20 |[#43:0,#44:0]| 
|7 |#35:0|Data |Alpha |B  |     |30 |[#45:0,#46:0]| 
|8 |#36:0|Data |Bravo |A  |     |99 |[#47:0,#48:0]| 
+----+-----+------+------+------+-------------------+----+-------------+ 

9 item(s) found. Query executed in 0.012 sec(s). 

Ceci est incorrect. Je ne veux pas Edges # 42: 0, # 44: 0, # 46: 0 et # 47: 0:

#42:0 connects Node(Bravo,A) and Data(Alpha,A) 
#44:0 connects Node(Bravo,A) and Data(Alpha,A) 
#46:0 connects Node(Bravo,B) and Data(Alpha,B) 
#47:0 connects Node(Alpha,A) and Data(Bravo,A) 

Il ressemble à ajouter plusieurs entrées joinFieldName dans le transformateur entraîne dans une opération OU, mais j'aimerais un 'ET' ici.

Est-ce que quelqu'un sait comment résoudre ce problème? Je ne suis pas sûr de ce que je fais différemment que l'autre question StackOverflow ...

+0

avez-vous trouvé le correctif pour cela? J'ai le problème similaire. –

+0

J'ai trouvé une solution de contournement et j'ai pensé à la partager. –

Répondre

1

Après avoir débogué le code ETL, j'ai trouvé une solution de contournement. Comme vous l'avez dit, il n'y a aucun moyen de rendre les multiples formes joinFieldName s un bord. Chaque joinFieldName va créer un bord.

Ce que vous pouvez faire est, générer une colonne supplémentaire dans le fichier CSV par concaténer « Label1 » et « Label2 » et utiliser lookup requête dans edge transformation, quelque chose comme, supposons que votre data.csv a un champ supplémentaire comme label1_label2 et les valeurs de ce champ sont quelque chose comme « label1 ==== label2`.

Votre transformation de bord doit comporter les éléments suivants

{ "edge": { "class": "Source", 
       "joinFieldName": "label1_label2", 
       "lookup": "select expand(n) from (match {class: Node, as: n} return n) where n.Label1+'===='+n.Label2 = ?", 
       "direction": "in" 
      } 
} 

ne pas oublier de expand le sommet autrement, pense que ce ETL est un document: l'astuce consiste à écrire une requête en concaténant plusieurs champs et en passant l'équivalent joinFieldName.

+0

Je vais devoir essayer ça. Pour l'importation de mes nœuds, j'ai ajouté un transformateur "field" pour concaténer les clés en utilisant quelque chose comme '{" field ": {" fieldName ":" MergedKey "," expressin ":" Label1.append (':'). Append (Label2) "}},' pour générer un champ "MergedKey" avec des entrées comme "Label1: Label2" pour importer mes noeuds. Ensuite, pour importer mes entrées de données, j'ai fait la même chose pour créer une entrée MergedKey et ensuite j'ai supprimé le champ après avoir créé le bord dans la section 'transformers'. Il pollue toujours mes données de noeud en gardant cette clé fusionnée cependant. J'aimerais qu'il y ait une façon plus propre de faire cela. – TxAG98