我有一个包含2个递归字段的表PersonID和FollowPersonID,用于存储人员之间的所有关系(人1跟随人2,人2跟随人1),我想在neo4J中提取并创建关联网络。有一个简单的方法吗?
答案 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进行不同的操作,因此可以设置其他属性的值,具体取决于节点是否存在,或者是否为新节点