我正在玩 Neo4j,但试图了解图形概念。作为一个学习过程,我想将一个小型 Postgres 关系数据库模式移植到 Neo4j。有什么方法可以移植它并向 Neo4j 发出“等效”关系查询?
5 回答
恐怕不是。关系数据模型和图数据模型是对现实世界领域进行建模的两种不同方式。它需要人脑(至少截至 2013 年)来理解领域以便对其进行建模。
我建议你拿一张纸,用圆圈和箭头记录你的实体是什么(节点)以及它们之间的关系(关系)。然后,看看那张纸。瞧,您的新 Neo4j 数据模型。
然后,获取一个您想要回答的查询,并尝试找出在没有计算机的情况下您将如何做到这一点,只需用手指在那张纸上跟踪您的节点和关系。一旦你弄清楚了,将你所做的转换成一个 Cypher 查询。
看看 neo4j.org,有很多例子。
是的,您可以将现有模式移植到图形数据库。请记住,这不一定是您数据的最佳模型,但它是一个起点。
它有多容易在很大程度上取决于您现有模式的质量。
与实体关系图中的实体对应的表定义了您的节点类型。在即将发布的 neo4j 2.0 中,您可以使用实体名称对它们进行标记,以便于查找。在旧版本中,您可以使用索引或手动标签属性。
假设最好的情况是,数据之间的所有关系都使用外键建模,接下来可以识别和移植节点之间的任何 1:1 关系。
对于建模 n:m 关系的表,识别相应的节点并在它们之间添加直接关系。
因此,作为示例假设表Author[id, name, publisher foreign key]
,Publisher[id, name]
和。Book[id, title]
written_by[author foreign key, book foreign key]
- 中的每一行
Author
和成为一个节点。Publisher
Book
- 每个
Author
节点都与由外键关系标识的发布者建立关系。 - 对于中的每一行,添加节点和引用的节点
written_by
之间的关系Author
Book
对于 neo4j 中的查询,我推荐 cypher,因为它具有表现力。查找某个作者的书籍的(2.0)查询如下所示:
MATCH (author:Author)-[:written_by]-(book:Book)
WHERE author.name='Hugh Laurie'
RETURN book.title
您实际上有几个选择:
- 为 Neo4J使用Talend 连接器
- 将您的架构+数据导出到批量导入器可使用的 CSV 文件中
- 或者您可以以编程方式进行
看一下这个:
musicbrainz -> neo4j https://github.com/redapple/sql2graph/tree/master/examples/musicbrainz
Neo4j Sql-importer https://github.com/peterneubauer/sql-import
祝你好运!
这个工具正是这样做的。将任何关系数据库导入 neo4j https://github.com/jexp/neo4j-rdbms-import