2016-11-30 85 views

回答

0

该表格(我称之为“Follows”)可以变成两个Person节点之间的关系FOLLOWS

你应该可以使用一些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); 
+0

从你之前对另一个问题的回答可知,MATCH不能使用索引进行查找吗?你不需要将行属性别名到他们自己的值来利用索引吗? – InverseFalcon

+0

:-)让我检查一下... – cybersam

+1

我更新了其他[答](http://stackoverflow.com/a/40897104/974731)与更多信息。我的答案*中的查询可能会导致规划者使用一个或两个'MATCH'模式的索引。但目前似乎有一个错误,它会阻止您指定'USING INDEX'提示,除非您使用我的其他答案中提到的解决方法。 – cybersam

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允许有也执行不同的操作创建和匹配,所以它可以设置其他属性值,根据节点的存在,或者如果它是一个新的节点

+0

感谢您的回答。我直接从一个文件中尝试,它可以用于几行... 但是当我在文件中有很多行时,它开始思考和思考。 不知道我知道如何从文件创建索引? - 我真的很新。 从'file:/// C:\\ collab1.csv'载入CSV文件作为行 MERGE(p:Person {PersonId:row.EntityID}) MERGE(f:Person {PersonID:row.ownerEntityID, EnterpriseID:row.EnterpriseId}) CREATE(p) - [:FOLLOWS] - >(f) –

+0

Direct Neo4j提交部分数据。在加载CSV之前放置使用定期提交。更重要的是始终使用节点标签,关系类型和属性名称 - 它们区分大小写! PersonID和PersonId是不同的!你认为你的数据集中PersonId是唯一的吗?如果是的话,像我之前的答案一样创建约束。在加载语句前执行此操作。另外,MERGE正在寻找您指定的所有属性。你的第一个MERGE试图通过PersonId找到Person,第二个试图找到具有2个属性(PersonID和EnterpriseID)的Person。那是你正在尝试做什么? – Vardan

+0

不知道你的数据很难猜到,但这里有一个例子: – Vardan