1

我有一些我正在跟踪的数据,看起来像这样:

节点.csv
Label1,Label2
Alpha,A
Alpha,B
Alpha,C
Bravo,A
Bravo,B

配对Label1Label2在此数据集中定义一个唯一条目。

我有另一个表,其中包含一些值,我想链接到在以下位置创建的顶点Table1

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

我想从条目中生成边DataNode两个Label1Label2字段在每个中匹配的时间。

在这种情况下,我有:

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:

#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在转换器中添加多个条目会导致 OR 操作,但我在这里想要一个“AND”。

有谁知道如何解决这一问题?我不确定我在做什么与其他 StackOverflow 问题不同......

4

1 回答 1

1

调试 ETL 代码后,我想出了一个解决方法。正如你所说,没有办法让多个joinFieldNames 形成一个边缘。每个joinFieldName人都会创造一个优势。

您可以做的是,通过连接“Label1”和“Label2”在 CSV 文件中生成一个额外的列,并lookup在转换中使用查询edge,例如,假设您的 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.

于 2017-07-15T21:10:44.070 回答