Neo4j图建模性能和可恢复性,属性到节点或作为单独的节点加上关系

时间:2015-08-01 19:39:53

标签: neo4j

我正在自学图形建模并使用带有NodeJs和Express框架的Neo4j 2.2.3数据库。

我浏览了免费的neo4j图形数据库书籍,学习了如何建模场景,何时使用关系以及何时创建节点等。

我已经建模车辆销售方案,具有以下结构

NODES

(:VEHICLE{mileage:xxx, manufacture_year: xxxx, price: xxxx})
(:VFUEL_TYPE{type:xxxx}) x 2 (one for diesel and one for petrol)
(:VCOLOR{color:xxxx}) x 8 (red, green, blue, .... yellow) 
(:VGEARBOX{type:xxx}) x 2 (AUTO, MANUAL) 

关系

(vehicleNode)-[:VHAVE_COLOR]->(colorNode - either of the colors)
(vehicleNode)-[:VGEARBOX_IS]->(gearboxNode - either manual or auto)
(vehicleNode)-[:VCONSUMES_FUEL_TYPE]->(fuelNode - either diesel or petrol)

假设我们有其他功能的上述结构等。  enter image description here

如上面的屏幕截图所示(136& 137是车辆节点),车辆的大部分功能都是作为单独的节点创建的,并在具有共同特征和关系的车辆之间共享。

请问您可以告知颜色,车身类型,驾驶侧(左侧驾驶或右侧驾驶),变速箱等角色(标签)是否应该是车辆节点的单独节点或属性?哪个选项更加性能友好,易于查询?

我想编写一个JS代码,允许使用一个或多个搜索条件查询具有上述结构的图形。如果这些功能中的大部分都是VEHICLE节点的属性,则查询并不困难:

MATCH (v:VEHICLE) WHERE v.gearbox = "MANUAL" AND v.fuel_type = "PETROL" AND v.price > x AND v.price < y AND .... RETURN v; 

然而,对于我现有的图形模型,它很难搜索,特别是当有多个标准不一定是VEHICLE节点的属性而是单独的节点并通过关系链接时。

有关图表现有结构的任何想法和建议,以使其更具查询性和性能友好性将非常感激。如果我们想象一个具有1000个VEHICLE节点的场景将产生15000个关系,听起来有点可怕,如果它达到一百万辆车,那么最多可以达到1500万个关系。如果我朝错误的方向前进,请发表评论。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

建模充满了权衡,看起来你有一个不错的开始。

不要担心关系的数量。这就是图形数据库所擅长的,所以我不会太担心过度使用它们。

某些东西应该是属性还是节点?我不能回答你的情况,但有些事情需要考虑:

  • 如果你一直看到一个值,并且你有很多对象,那么找到一个节点然后连接到它的所有东西通常会更快,因为图形DB擅长利用关系。扫描标签的所有节点并找到属性=值的项目的速度较慢。
  • 当您想要表达与非简单原始数据类型的连接时,关系可以很好地工作。例如,拿“变速箱”。有手册和其他类型......如果它是属性值,您将不会轻易地决定存储“变速箱”的其他4个子类型/子方面。如果它是一个节点,那么以后会很容易,因为你可以向节点添加更多属性,或者关联其他东西。
  • 如果一条数据确实是一个原始数据(字符串,整数等),并且您不需要额外的细节,那通常会成为一个好的属性。通过连接到其他节点来查询原始值在以后看起来很笨拙。例如,我不会将具有“出生日期”的人模型化为单独的节点,这会使查询烦恼,并且会为您提供您将来不太可能需要的灵活性。
  • 从语义上讲,您的数据如何相关?如果两个项目相似,因为它们共享一个X,那么该X可能应该是一个节点。如果两个项碰巧具有相同的Y值但实际上没有多大意义,那么Y可能更适合作为节点属性。