如何从SQL递归层次关系表转换为Neo4j?

时间:2016-11-30 09:59:11

标签: neo4j

我有一个包含2个递归字段的表PersonID和FollowPersonID,用于存储人员之间的所有关系(人1跟随人2,人2跟随人1),我想在neo4J中提取并创建关联网络。有一个简单的方法吗?

2 个答案:

答案 0 :(得分:0)

该表(我将其称为“Follows”)可以转换为两个FOLLOWS节点之间的Person关系。

您应该可以使用一些APOC procedures for loading using JDBC来帮助您完成此操作。

以下是一个例子:

CALL apoc.load.driver("com.mysql.jdbc.Driver")
CALL apoc.load.jdbc("jdbc:mysql://localhost:3306/mydb?user=root", "Follows") YIELD row
MATCH (p1:Person {id: row.PersonId}), (p2:Person {id: row.FollowPersonId})
MERGE (p1)-[:FOLLOWS]->(p2);

如果该表很大(或者有很多Person个节点),那么首先在Person(id)上创建一个索引(或唯一性约束)来加速导入也是有意义的:

CREATE INDEX ON :Person(id);

如果您创建索引,则此查询形式应确保使用索引(有关详细信息,请参阅this other answer):

CALL apoc.load.driver("com.mysql.jdbc.Driver")
CALL apoc.load.jdbc("jdbc:mysql://localhost:3306/mydb?user=root", "Follows") YIELD row
WITH row.PersonId AS id1, row.FollowPersonId AS id2
MATCH (p1:Person {id: id1}), (p2:Person {id: id2})
USING INDEX p1:Person(id)
USING INDEX p2:Person(id)
MERGE (p1)-[:FOLLOWS]->(p2);

答案 1 :(得分:0)

如果您正在寻找连接数据库的方法,那么您可以使用APOC连接和检索数据,例如以下步骤

CALL apoc.load.driver('your_jdbc_driver');
CALL apoc.load.jdbc( url, 'SELECT PersonID, FollowPersonID FROM PersonFollow;' )

然后,如果使用MERGE,则可以创建所有节点和关系。例如:

CREATE CONSTRAINT ON (p:Person) ASSERT p.PersonID IS UNIQUE;

with "your_jdbc_url" as url
CALL apoc.load.jdbc( url, 'SELECT PersonID, FollowPersonID 
FROM PersonFollow;' ) YIELD row
MERGE (p:Person {PersonID:row.PersonID})
MERGE (f:Person {PersonID:row.FollowPersonID})
CREATE (p)-[:FOLLOWS]->(f)

MERGE允许使用ON CREATE和ON MATCH进行不同的操作,因此可以设置其他属性的值,具体取决于节点是否存在,或者是否为新节点