我有一个类似于 Twitter 图表的数据集。数据的形式如下:
<user-id1> <List of ids which he follows separated by spaces>
<user-id2> <List of ids which he follows separated by spaces>
...
我想以单向图的形式对此进行建模,用密码语法表示为:
(A:Follower)-[:FOLLOWS]->(B:Followee)
同一用户可以在数据集中出现多次,因为他可能出现在多个人的好友列表中,并且他也可能将其好友列表作为数据集的一部分。这里的挑战是确保任何用户都没有重复的节点。如果用户在数据集中同时显示为 Follower 和 Followee,则节点的标签应具有这两个值,即 Follower:Followee。图中约有 980k 个节点,数据集大小为 1.4 GB。
我不确定 Cypher 的加载 CSV 是否可以在这里工作,因为数据集的每一行都有可变数量的列,因此无法编写查询来为每列生成节点。那么,将这些数据导入 Neo4j 而不创建任何重复项的最佳方法是什么?
最佳答案
我实际上对 friendster dataset 做了完全相同的事情,其格式与您的格式几乎相同。
许多 friend 的分隔符是“:”。
我在那里使用的查询是:
create index on :User(id);
USING PERIODIC COMMIT 1000
LOAD CSV FROM "file:///home/michael/import/friendster/friends-000______.txt" as line FIELDTERMINATOR ":"
MERGE (u1:User {id:line[0]})
;
USING PERIODIC COMMIT 1000
LOAD CSV FROM "file:///home/michael/import/friendster/friends-000______.txt" as line FIELDTERMINATOR ":"
WITH line[1] as id2
WHERE id2 <> '' AND id2 <> 'private' AND id2 <> 'notfound'
UNWIND split(id2,",") as id
WITH distinct id
MERGE (:User {id:id})
;
USING PERIODIC COMMIT 1000
LOAD CSV FROM "file:///home/michael/import/friendster/friends-000______.txt" as line FIELDTERMINATOR ":"
WITH line[0] as id1, line[1] as id2
WHERE id2 <> '' AND id2 <> 'private' AND id2 <> 'notfound'
MATCH (u1:User {id:id1})
UNWIND split(id2,",") as id
MATCH (u2:User {id:id})
CREATE (u1)-[:FRIEND_OF]->(u2)
;
关于java - 将社交网络数据加载到 Neo4J 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25189692/