我有一个2递归字段PersonID和FollowPersonID的表,存储所有人之间的关系(人1跟随人2,人2跟随人1),我想提取并创建neo4J相关的网络。是否有捷径可寻?如何将SQL递归层次关系表转换为Neo4j?
回答
该表格(我称之为“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);
如果您正在寻找各种方法来连接到数据库,那么你可以使用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允许有也执行不同的操作创建和匹配,所以它可以设置其他属性值,根据节点的存在,或者如果它是一个新的节点
感谢您的回答。我直接从一个文件中尝试,它可以用于几行... 但是当我在文件中有很多行时,它开始思考和思考。 不知道我知道如何从文件创建索引? - 我真的很新。 从'file:/// C:\\ collab1.csv'载入CSV文件作为行 MERGE(p:Person {PersonId:row.EntityID}) MERGE(f:Person {PersonID:row.ownerEntityID, EnterpriseID:row.EnterpriseId}) CREATE(p) - [:FOLLOWS] - >(f) –
Direct Neo4j提交部分数据。在加载CSV之前放置使用定期提交。更重要的是始终使用节点标签,关系类型和属性名称 - 它们区分大小写! PersonID和PersonId是不同的!你认为你的数据集中PersonId是唯一的吗?如果是的话,像我之前的答案一样创建约束。在加载语句前执行此操作。另外,MERGE正在寻找您指定的所有属性。你的第一个MERGE试图通过PersonId找到Person,第二个试图找到具有2个属性(PersonID和EnterpriseID)的Person。那是你正在尝试做什么? – Vardan
不知道你的数据很难猜到,但这里有一个例子: – Vardan
- 1. 将XSD转换为SQL关系表
- 2. SQL递归层次结构
- 3. 将递归转换为'tail递归'
- 4. 如何将循环转换为递归?
- 5. 如何在本例中将递归转换为尾递归?
- 6. 递归关系SQL错误
- 7. 将SQL转换为关系代数
- 8. 将SQL查询转换为ActiveRecord关系
- 9. SQL计算列,递归总结层次
- 10. 如何将列表转换为层次结构dict
- 11. 将一系列父子关系转换为分层树?
- 12. 如何递归总结父/子层次
- 13. 如何将多层嵌套的JSON转换为SQL表格
- 14. 将关系代数关系转换为SQL(INTERSECT)?
- 15. 如何将关系(具有属性)转换为关系模式/ sql?
- 16. 将enum转换为类层次结构
- 17. 将此层次转换为xml?困惑
- 18. 将迭代转换为递归
- 19. 将嵌套循环转换为递归
- 20. 将循环转换为递归函数
- 21. 将PHP数组递归转换为XML?
- 22. 将递归函数转换为尾递归
- 23. 将返回2递归的递归函数转换为迭代
- 24. 将Neo4j DB转换为XML?
- 25. 转换为递归方法
- 26. 如何将EER转换为SQL表?
- 27. 将SQL Server中的递归CTE转换为netezza
- 28. 为递归关系编写关联
- 29. Laravel递归关系
- 30. Django递归关系
从你之前对另一个问题的回答可知,MATCH不能使用索引进行查找吗?你不需要将行属性别名到他们自己的值来利用索引吗? – InverseFalcon
:-)让我检查一下... – cybersam
我更新了其他[答](http://stackoverflow.com/a/40897104/974731)与更多信息。我的答案*中的查询可能会导致规划者使用一个或两个'MATCH'模式的索引。但目前似乎有一个错误,它会阻止您指定'USING INDEX'提示,除非您使用我的其他答案中提到的解决方法。 – cybersam