2017-03-27 34 views
1

我有一些數據,我要跟蹤,看起來是這樣的:OrientDB ETL的匹配條件使用多個字段創建邊緣

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

的對Label1Label2定義一個唯一的入口這個數據集。

我有了在它的一些價值觀,我想鏈接到Table1創建的頂點另一個表:

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

我想產生Data從入口邊緣當Label1Label2中的每一個都匹配時,則爲Node

在這種情況下,我想有:

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) 

在另一個question看來,這個問題得到通過簡單地增加一個額外的「joinFieldName」進入JSON文件解決了,但我沒有收到與我的數據相同的結果。

我node.json文件看起來像:

{ 
    "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": [] 
     } 
    } 
} 

和我data.json文件看起來像這樣:

{ 
    "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": [] 
     } 
    } 
} 

我運行這些後,我得到這個輸出,當我查詢結果:

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). 

這是不正確的。我不想邊緣#42:0,#44:0,#46:0和#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) 

它看起來像添加多個變壓器joinFieldName條目被產生或運算,但我想在這裏有'AND'。

有誰知道如何解決這個問題?我不知道我在做什麼不同於其他StackOverflow問題...

+0

你有沒有想過解決這個問題?我有類似的問題。 –

+0

我想出了一個解決方法,並想到分享它。 –

回答

1

調試ETL代碼後,我想出了一個解決方法。正如你所說,沒有辦法讓多個joinFieldName形成一個邊緣。每個joinFieldName將創建一個邊緣。

你可以做的是,通過連接「Label1的」和「Label2的」生成CSV文件中一個額外的列和edge改造,像使用lookup查詢,假設你的data.csv有一個像label1_label2和一個額外的字段該字段的值是像「LABEL1 ==== label2`。

你邊改造應具有以下

{ "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" 
      } 
} 

不要忘了expand頂點,否則,ETL認爲它是一個文檔。這裏的技巧是編寫一個查詢通過連接多個字段並傳遞相應的joinFieldName

+0

我必須嘗試一下。爲了導入我的節點,我添加了一個「字段」變換器來連接使用類似'{「field」:{「fieldName」:「MergedKey」,「expressin」:「Label1.append(':')。append( Label2)「}},'生成一個」MergedKey「字段,其中有像Label1:Label2這樣的條目來導入我的節點。然後,爲了導入我的數據條目,我做了同樣的事情,在那裏創建一個MergedKey條目,然後在'transformers'部分創建邊緣之後,我刪除了該字段。它仍然通過保留合併的密鑰來污染我的節點數據。我希望有一個更乾淨的方式來做到這一點。 – TxAG98