将社交网络数据加载到Neo4J中

时间:2014-08-07 18:35:29

标签: java graph neo4j cypher

我有一个类似于Twitter图表的数据集。数据采用以下形式:

<user-id1> <List of ids which he follows separated by spaces>
<user-id2> <List of ids which he follows separated by spaces>
...

我想以单向图的形式对此进行建模,用cypher语法表示为:

(A:Follower)-[:FOLLOWS]->(B:Followee)

同一个用户可以在数据集中出现多次,因为他可能在多个人的朋友列表中,并且他也可能将他的朋友列表作为数据集的一部分。这里的挑战是确保任何用户都没有重复的节点。如果用户在数据集中同时显示为Follower和Followee,则节点的标签应该具有两个值,即Follower:Followee。图中大约有980k个节点,数据集大小为1.4 GB。

我不确定Cypher的加载CSV是否可以在这里工作,因为数据集的每一行都有可变数量的列,因此无法编写查询来为每个列生成节点。那么在不创建任何重复项的情况下将这些数据导入Neo4j的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我的friendster dataset实际上完全相同,格式与您的格式几乎相同。

许多朋友的分隔符是&#34;:&#34;。

我在那里使用的查询是:

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)
;