我正在创建一个通讯图
每条消息都有一个msgid,每个人都有一个用户ID
我已经创建了消息顶点,现在我想创建用户顶点和将消息顶点连接到用户顶点的边。
用户可以获得多条消息(显然)
我的档案包含:
msgstr,userid,(以及我将分配给边缘的其他一些信息)
我所拥有的isssue是在我的文件中我有重复的userids(因为用户可以获得多个消息),我不想创建另一个具有用户ID的顶点,所以我跳过了重复。但是,如果我跳过重复,边缘将不会被创建。我想要多个边到同一个用户顶点,因为每条边代表一条消息。
如何保持用户顶点唯一但创建边缘?
我当前的ETL .json文件,除了我上面详述的内容之外,它可以正常工作。
{
"source": { "file": { "path": "msgs.txt" } },
"extractor": { "row": {} },
"transformers": [
{ "csv": {"separator": "\t"} },
{ "vertex": { "class": "user", "skipDuplicates": true } },
{ "edge": { "class": "sent_to", "joinFieldName": "msgid", "lookup":"message.id","direction": "in" } },
"edgeFields": { "n": "${input.n}" }
],
"loader": {
"orientdb": {
"dbURL": "remote:/localhost/databases/communication",
"dbType": "graph",
"classes": [
{"name": "user", "extends": "V"},
{"name": "message", "extends": "V"},
{"name": "sent_to", "extends": "E"}
], "indexes": [
{"class":"user", "fields":["id"], "type":"UNIQUE" }
]
}
}
}
答案 0 :(得分:2)
好的,这就是我所做的,它似乎有用。
首先,我创建了消息顶点(如上所述,在q。中)
然后我创建了用户顶点
然后在它们之间创建边缘我在一个有{userid,msgid,...}的文件上运行以下ETL
{
"source": { "file": { "path": "msgs1.txt" } },
"extractor": { "row": {} },
"transformers": [
{ "csv": {"separator": "\t"} },
{ "merge": {"joinFieldName": "userid", "lookup": "user.id"} },
{ "vertex": { "class": "user", "skipDuplicates": true } },
{ "edge": { "class": "sent_to",
"joinFieldName": "msgid",
"lookup":"message.id",
"direction": "in",
"edgeFields": { "n": "${input.n}", "date": "${input.date}"}
}
}
],
"loader": {
"orientdb": {
"dbURL": "remote:/localhost/databases/communication",
"dbType": "graph",
"classes": [
{"name": "user", "extends": "V"},
{"name": "message", "extends": "V"},
{"name": "sent_to", "extends": "E"}
],
"indexes": [
]
}
}
}
这创建了所有边缘,即使有多个边指向用户 希望这会帮助某人