【问题标题】:Neo4j data modeling for branching/merging graphs用于分支/合并图的 Neo4j 数据建模
【发布时间】:2014-07-22 16:21:02
【问题描述】:

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

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

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

我很想知道你们的想法,任何想法表示赞赏。

【问题讨论】:

    标签: neo4j branching-and-merging


    【解决方案1】:

    我不确定您的经验水平如何。对此的任何见解都会有所帮助。

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

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

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

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

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

    【讨论】:

    • 在我们的初创公司中,我们已经在该系统上工作了 4 年多,它已在生产中使用。它基于 SQL,我们正在评估 Neo4j 作为下一代的替代品。所以我知道如何在 Neo4j 中创建节点、连接、属性、标签等。这是一个协作系统,我们希望用户在他们自己的单独“分支”中编辑图形,并将他们的更改合并回主“分支”,就像在源代码管理系统中一样。我的问题是我们应该如何在 Neo4j 中为这样的“分支”建模?
    【解决方案2】:

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

    这可能类似于分支,当您合并时让每个人在他们自己的数据库副本上运行一个脚本,将其副本中的所有节点和边都放入一个 CSV 中。浏览器

    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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-06
      • 2012-10-10
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 2014-06-06
      • 2019-10-21
      • 1970-01-01
      相关资源
      最近更新 更多