【问题标题】:How to model properties that have a Code/Description如何为具有代码/描述的属性建模
【发布时间】:2015-11-16 13:50:56
【问题描述】:

我来自关系背景,是 Neo4J 数据建模的新手。我正在尝试建立一个 neo4j 模型来保存有关公司及其关系的信息。

我有一个关于如何为符合一组代码(受控词汇)的属性设置公司节点属性的问题

假设公司节点的属性是“公司类型”,假设可能的值是

  • 大众有限公司
  • 私人持有
  • 有限责任合伙企业
  • 等等..(比如 50 个可能的值)

在这种情况下,我们可以简单地将 Company_Type 作为公司节点的属性 .. 没问题 ...

实际上唯一的区别是这样的东西有一个代码和一个描述,例如:

  • 1001 - 大众有限公司
  • 1002 - 私人持有
  • 1003 - 有限责任合伙企业

等等……

我确实看到模型需要能够支持代码查询并能够显示描述。

在关系世界中 - 这是从公司表到小型查找表的典型 FKey ...我想知道如何在 Neo4J 中最好地对其进行建模

我可以满足我的要求的一种方法是定义 2 个属性:Company_Type_Code、Company_Type_Description 并根据需要使用它们。这通常是如何完成的?

或者我是否将“公司类型”设置为节点并将其与公司节点相关联。似乎很浪费,因为数百万行将指向节点 1001 ...

由于这种情况很常见,因此想检查处理具有代码/描述的属性的最佳做法。

【问题讨论】:

    标签: neo4j data-modeling


    【解决方案1】:

    最好的办法可能是将 CompanyType 存储为一种带标签的节点。然后公司类型可以同时具有代码和描述。将新公司放入数据库时​​,您将创建与标记为 :CompanyType 的正确节点的关系,然后就完成了。

    我猜你会想要按类型查询公司,这就是为什么将它分成一个节点可能是个好主意。当然你可以在每个节点中保留代码和描述,但这会重复很多数据,当需要查找特定类型的所有公司时,如果必须扫描所有@,查询会更慢987654322@ 个节点,以便找到两个属性具有特定值的节点。

    所以你应该这样做:

    CREATE (:CompanyType { code: "1003", label: "Limited Liability Partnership" });
    
    MATCH (ct:CompanyType { code: "1003" }
    WITH ct
    CREATE (comp:Company { name: "FooSoft, LLC" })
    MERGE (comp)-[:type]->(ct);
    

    此方法将在以后简化聚合,减少数据重复,利用图形结构并加快查询速度。所以双赢。

    从 RDBMS 的角度来看,您通常可以认为将事物拆分到单独的表中等同于创建单独的节点并使用关系。您还可以将向节点添加内容视为属性,这与 RDBMS 中的非规范化非常相似。

    【讨论】:

      【解决方案2】:

      在大多数情况下,您希望通过为每种公司类型设置一个节点来进行建模,并使用COMPANY_IS_OF_TYPE 关系将您的公司节点连接到相应类型:

      CREATE (pub:CompanyType{name:'Public Limited',code:1001})
      CREATE (priv:CompanyType{name:'Privately Held',code:1002})
      CREATE (llp:CompanyType{name:'Limited Lialibty Partnership',code:1003})
      CREATE (neo:Company{name:'Neo Technology'})
      CREATE (neo)-[:COMPANY_IS_OF_TYPE]->(priv)
      

      由于所有公司类型共享相同的标签,您可以非常快速地获得它们 - 请记住标签是自索引的:

      MATCH (t:CompanyType)<-[:COMPANY_IS_OF_TYPE]-(c)
      RETURN t.name, count(c)
      

      这为您提供了每种公司类型的一些统计数据。

      【讨论】:

        猜你喜欢
        • 2021-03-09
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 2016-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多