Neo4j图形将性能和可查询性、属性建模为节点或作为单独的节点加关系
我正在自学图形建模,并将Neo4j 2.2.3数据库与NodeJs和Express框架结合使用 我浏览了免费的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
(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作为节点属性可能更好
MATCH (v:VEHICLE) WHERE v.gearbox = "MANUAL" AND v.fuel_type = "PETROL" AND v.price > x AND v.price < y AND .... RETURN v;