Neo4j图形将性能和可查询性、属性建模为节点或作为单独的节点加关系

Neo4j图形将性能和可查询性、属性建模为节点或作为单独的节点加关系,neo4j,Neo4j,我正在自学图形建模,并将Neo4j 2.2.3数据库与NodeJs和Express框架结合使用 我浏览了免费的neo4j图形数据库书籍,学习了如何建模场景、何时使用关系以及何时创建节点等 我用以下结构模拟了一个汽车销售场景 节点 关系 (vehicleNode)-[:VHAVE_COLOR]->(colorNode - either of the colors) (vehicleNode)-[:VGEARBOX_IS]->(gearboxNode - either manual or

我正在自学图形建模,并将Neo4j 2.2.3数据库与NodeJs和Express框架结合使用

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

我用以下结构模拟了一个汽车销售场景

节点

关系

(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)
假设我们有上面的结构,其他的特性也是如此。

如上面的屏幕截图所示(136和137是车辆节点),车辆的大多数功能都创建为单独的节点,并在具有公共功能和关系的车辆之间共享

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

我想写一个JS代码,允许使用一个或多个搜索条件查询具有上述结构的图。如果这些特征中的大多数是车辆节点的属性,那么查询就不难了:

MATCH (v:VEHICLE) WHERE v.gearbox = "MANUAL" AND v.fuel_type = "PETROL" AND v.price > x AND v.price < y AND .... RETURN v; 
匹配(v:VEHICLE),其中v.gearbox=“手动”和v.fuel\u type=“汽油”和v.price>x和v.price
然而,对于我现有的图形模型,搜索起来很困难,特别是当存在多个条件时,这些条件不一定是车辆节点的属性,而是单独的节点,并通过关系链接

如果您对图形的现有结构有任何想法和建议,以使其更易于查询和性能友好,我们将不胜感激。如果我们设想一个场景,有1000个车辆节点,将产生15000个关系,听起来有点可怕,如果它击中一百万个车辆,那么最多会有1500万个关系。如果我走错了方向,请发表评论


谢谢您的时间。

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

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

应该是属性还是节点?我无法回答您的情况,但以下是一些需要考虑的事项:

  • 如果您一直按某个值查找某个对象,并且您有许多对象,那么通常会更快地找到一个节点,然后找到与之连接的所有节点,因为graph DB擅长利用关系。扫描标签的所有节点并查找属性=值的项目要慢一些
  • 当您希望表示与非简单基本数据类型的对象的连接时,关系可以很好地工作。例如,以“变速箱”为例。有手册和其他类型……如果是属性值,您以后将无法轻松决定存储“齿轮箱”的其他4个子类型/子方面。如果它是一个节点,那么以后就很容易了,因为您可以向该节点添加更多属性,或者关联其他内容
  • 如果一段数据实际上是一个基元(字符串、整数等),并且您不需要关于它的额外细节,那么这通常是一个很好的属性。稍后,通过连接到其他节点来查询基元值会显得笨拙。例如,我不会将一个有“出生日期”的人建模为一个单独的节点,这会使查询变得烦人,并且会为您提供将来不太可能需要的灵活性
  • 从语义上讲,您的数据是如何关联的?如果两个项目相似,因为它们共享一个X,那么该X可能应该是一个节点。如果两个项目恰好具有相同的Y值,但这并不意味着什么,那么Y作为节点属性可能更好

我认为绝对有可能建立太多的关系。不是因为Neo4j无法处理它,而是因为它开始增加查询的复杂性。在许多情况下,如果值非常简单,我建议从属性开始。如果需要,可以很容易地迁移数据并在以后创建节点。此外,当您说搜索标签的属性通常比先查找节点然后再查找其关系要慢时,当标签/属性组合具有索引时,这是真的吗?我怀疑这取决于图形的大小和不同部分中关系的密度。一切都取决于数据量和查询模式。我不认为在不知道这些事情的情况下,有任何关于什么更快的具体答案。是的,我同意你可以在使你的问题复杂化方面过度建立关系。很难提供关于何时拥有/何时建立关系的确切答案。所以,取而代之的是关于“什么意味着财产”、“什么意味着关系”的一般规则。尽管这取决于查询负载/数据量,但一切都是有延展性的。请点击@frobberoffits获取详细解释。就数据的连通性而言,基本上假设有人想要——一辆宝马、柴油和手动变速箱,发动机尺寸为2.1,红色,2002年制造,里程为x,价格介于y和z之间的汽车。。。。。。。该图应返回所有符合条件的节点。我正在开发一个类似的模型。。。这对你有好处吗?
MATCH (v:VEHICLE) WHERE v.gearbox = "MANUAL" AND v.fuel_type = "PETROL" AND v.price > x AND v.price < y AND .... RETURN v;