OrientDB ETL使用匹配条件中的多个字段创建边
我正在跟踪的一些数据如下所示:OrientDB ETL使用匹配条件中的多个字段创建边,orientdb,orientdb2.2,orientdb-etl,Orientdb,Orientdb2.2,Orientdb Etl,我正在跟踪的一些数据如下所示: { "config": { "log": "info" }, "source": { "file": { "path": "./data.csv" } }, "extractor": { "csv": { } }, "transformers": [ { "vertex": { "class": "Data" } }, { "edge": { "class": "S
{
"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": []
}
}
}
node.csv
这对Label1
和Label2
在该数据集中定义了一个唯一的条目
我还有另一个表,其中有一些值,我想链接到在表1
中创建的顶点:
data.csv
当Label1
和Label2
字段在每个字段中匹配时,我希望从Data
中的条目到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)
在另一个例子中,这个问题似乎可以通过简单地在json文件中添加一个额外的“joinFieldName”条目来解决,但我的数据没有得到相同的结果
我的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:
看起来在转换器中添加多个joinFieldName
条目会导致OR操作,但我希望在这里使用“AND”
有人知道如何解决这个问题吗?我不确定我所做的与其他StackOverflow问题有什么不同…在调试ETL代码后,我找到了一个解决方法。正如您所说,无法使多个
joinFieldName
s形成一条边。每个joinFieldName
将创建一条边
您可以做的是,通过连接“Label1”和“Label2”在CSV文件中生成一个额外的列,并在edge
转换中使用lookup
query,例如,假设您的data.CSV有一个额外的字段,如Label1\u 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"
}
}
别忘了
展开
顶点,否则,ETL会认为它是一个文档。这里的诀窍是通过连接多个字段并传递等效的joinFieldName来编写一个查询。你找到解决方法了吗?我也有类似的问题。我找到了一个解决方法并考虑共享它。我会为了尝试这个方法,为了导入我的节点,我添加了一个“field”转换器来连接键,使用类似{“field”:{“fieldName”:“MergedKey”,“expressin”:“Label1.append(':').append(Label2)”},
来生成一个“MergedKey”“字段,其中包含类似于Label1:Label2
的条目以导入我的节点。然后,为了导入我的数据条目,我做了同样的事情,在那里创建了一个MergedKey条目,然后在transformers
部分中创建了边缘后删除了该字段。但它仍然会通过保留合并的键来污染我的节点数据。我希望有一个更干净的方法来做这件事。
#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)
{ "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"
}
}