用于分支/合并图的Neo4j数据建模

时间:2014-07-22 16:21:03

标签: neo4j branching-and-merging

我们正在开发一个系统,用户可以在其中定义自己的节点和连接,并可以使用任意查询进行查询。用户可以创建"分支"很像在SCM系统中,以后可以将更改合并回主图。

是否有可能为Neo4j创建有效的数据模型?什么是最好的方法?当然,我们不想复制每个分支的所有图形数据,因为我们在数据库中有数百万个节点。

我已经阅读了Ian Robinson关于Time-Based Versioned Graphs的优秀文章和Tom Zeppenfeldt与Network versioning using relationnodes的替代方法,但不幸的是他们正在解决另一个问题。

我很想知道你们的想法,任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

我不确定你的经验水平是多少。对此的任何见解都会有所帮助。

我猜这个系统会严重依赖节点上的标签。可能会提出非常广泛的5-20节点类型,包括名称和一些关键属性。然后,您可以允许用户从这些基本类别中进行选择,并通过添加标签来创建自己的衍生产品。

假设您有基本类别(:Thing {Name:“”,Place:“”}}和(:Object {Category:“”,Count:4})

您的用户会有一个下拉菜单或“Thing”和“Object”。例如,他们选择“Thing”,然后输入一个新标签(Say“Cool”),“Name”和“Place”的值,并添加任何自定义属性(IsAwesome:True)。

所以现在你有了一个新节点(:Thing:Cool {Name:“Rock”,Place:“Here”,IsAwesome:True})这允许您按大类或用户创建的类别进行查询。希望这会使每个广泛的类别保持与总节点数的比例。

不确定这是否正是您所要求的。祝你好运!

答案 1 :(得分:0)

嗯。虽然这不是疯了,但请考虑一下您首先要替换的系统类型。 SQL。在SQL数据库中,您不会使用分支,因为它的数据存储。如果您尝试将来自多个来源的数据导入一个数据库,我建议将它们全部导出到CSV文件,并使用cypher中的MERGE语句将它们全部导入到您的数据库中。

这可能表现为类似于分支,方法是让每个人在合并时在自己的数据库副本上运行脚本,从而获取副本中的所有节点和边缘并将它们全部放入CSV中。 IE

MATCH (n)-[:e]-(n2)
RETURN n,e,n2

然后将这些CSV与您的最终数据库进行比较,以查看其他副本中已存在的内容。

IMPORT CSV WITH HEADERS FROM "file:\\YourFile.CSV" AS file
MERGE (N:Node{Property1:file.Property1, Property2:file.Property2})
MERGE (N2:Node{Property1:file.Property1, Property2:file.Property2})
MERGE (N)-[E:Edge]-(N2)

只要您使用已经了解的节点类型并且每个人都没有创建您在合并之前不了解的新数据结构,这将有效。