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