我来自关系背景,是Neo4J数据建模的新手。我正在尝试构建一个neo4j模型来保存有关公司及其关系的信息。
我有一个关于如何为符合一组代码(受控词汇表)的属性设置公司节点属性的问题
因此,假设公司节点的属性为“公司类型”,并说明可能的值为
在这种情况下,我们可以简单地将Company_Type作为公司节点的属性..没问题......
实际上唯一的区别是这样的事情有代码和描述,例如:
我确实认为模型需要能够支持代码查询并能够显示描述。
在关系世界中 - 这是公司表中典型的FKey到一个小的查找表......我想知道如何在Neo4J中对此进行建模
我可以满足我的要求的一种方法是定义2个属性:Company_Type_Code,Company_Type_Description并根据需要使用它们。这通常是如何做到的?
或者我将“公司类型”设置为节点并将其与公司节点相关联。似乎浪费,因为数百万行将指向节点1001 ......
由于这种常见情况需要检查处理具有代码/描述的属性的最佳实践。
答案 0 :(得分:2)
可能最好的办法是将CompanyType存储为标记节点的类型。然后公司类型可以同时包含代码和描述。在数据库中放置新公司时,您需要创建与标记为:CompanyType
的正确节点的关系,并且您已完成。
我猜你想要按类型对公司进行查询,这就是为什么将它拆分成一个可能是个好主意的原因。节点。当然,您可以在每个节点中保留代码和描述,但这会复制大量数据,当需要查找特定类型的所有公司时,如果必须扫描所有公司,查询会更慢{ {1}}节点,以便找到两个属性具有特定值的节点。
所以你应该这样做:
:Company
此方法将在以后简化聚合,减少数据重复,利用图形结构并加快查询速度。赢得胜利。
从RDBMS的角度来看,您通常可以考虑在单独的表中将事物拆分为等同于创建单独的节点和使用关系。您还可以考虑将节点作为属性添加到节点,因为它与RDBMS中的非规范化非常相似。
答案 1 :(得分:1)
在大多数情况下,您希望通过为每个公司类型设置一个节点并使用 @view_config(route_name='my_view', renderer='')
def my_view(request):
renderer = request.matchdict['renderer']
data = get_my_data_for_renderer()
return render_to_response(renderer, data, request)
关系将公司节点连接到相应类型来对其进行建模:
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)
这为您提供了每种公司类型的一些统计信息。