如何为具有 Code/Description 的属性建模

How to model properties that have a Code/Description

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

我对如何为符合一组代码(受控词汇表)的属性设置公司节点的属性有疑问

所以假设公司节点的 属性 是 'Company Type' 并且假设可能的值是

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

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

等...

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

在关系世界中 - 这是公司中典型的 FKey table 到一个小查找 table ...我想知道如何在 Neo4J 中最好地建模它

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

或者我将 'Company Type' 设置为节点并将其与公司节点相关联。似乎很浪费,因为数百万行将指向节点 1001 ...

由于这种情况很常见,所以想了解一下处理具有 Code/Description.

属性的最佳做法是什么

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

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

所以你应该这样做:

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);

此方法将使以后的聚合变得容易,它减少了数据重复,利用了图形结构并加快了查询速度。所以 win/win.

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

在大多数情况下,您希望通过为每种公司类型创建一个节点来建模,并使用 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)

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