Neo4j我需要重复节点还是可以重用相同的节点?

问题描述 投票:0回答:2

我的任务是调查Neo4j以满足我们的业务需求。我已经创建了一些非常小的图来熟悉cypher语法。

我们有一个场景,用户可以通过许多选项进行搜索,然后需要显示其相关数据,并在结果被过滤时跟踪库存中的这些可用项目。作为一个简单的例子(但设计与我们需要的设计相同)。我们可能有4件衣服(T恤,毛衣,牛仔裤,衬衫),用户可以选择其中一件来展示他们的尺码和颜色等,并跟踪库存数量。然而,用户应该能够首先选择尺寸或颜色,而不是显示不同的项目(T恤,牛仔裤等)。基本上不同的组合取决于所选择的内容。

牛仔裤(20件库存)>红色(6)>小(2)或大号(4),牛仔裤>绿色>小或大,小>红色> T恤,衬衫,绿色>大> T恤

在这种情况下,是否需要为每个项目重复颜色和大小节点,或者我可以只创建一次并重复使用它们?这是我有点困惑的事情。对于一个选项节点,我们可能有150多个(国家列表)选择,如果每个选项节点都有自己独特的节点(但是作为新节点重复用于其他选项),那么这些节点有很多重复吗?我们可以拥有一百多万个节点......

对不起,如果这是一个愚蠢的问题!如果在Neo4j中有一种特殊的处理这种用例的方法,那就试着收集一下。

非常感谢您的帮助和建议。 :)

database search neo4j tree cypher
2个回答
1
投票

从本质上讲,这个问题可以追溯到ER建模中的旧​​的属性与实体问题

  1. 使用单独的entites。为颜色,大小,国家等创建单例节点似乎是一个可行的解决方案,您可以将它们重用于多个项目。例如,如果要为项目n指定红色,则发出以下查询:MATCH (r:Color {name: 'red'} CREATE (n)-[:HAS_COLOR]->(r)。要选择所有红色节点,请使用MATCH (n:Item)-[:HAS_COLOR]->(:Color {name: 'red'})。这种方法可以很容易地选择所有可用的颜色,例如MATCH (c:Color) RETURN DISTINCT c
  2. 使用属性。使用属性也应该正常工作。过滤更容易(MATCH (:Item {color: 'red'))和列出可用颜色可以使用MATCH (n) RETURN DISTINCT n.color实现

总之,与大多数数据建模问题一样,您可能需要经历几次迭代才能使数据模型正确,并且可能还需要进行一些基准测试/性能调整。幸运的是,Neo4j可以很容易地尝试不同的数据模型。


0
投票

通常有很多方法可以创建您的数据模型,您必须权衡利弊,找出最有效的方法。

考虑的一个方面,属性(属性)与实体,Gabor详细介绍。

另一个方面,仅考虑实体,是否要使用树结构,向下钻取到属性由树中其上方的节点定义的特定项,或者

例如,您可能有这样的树:

(jeans:Clothing:Attribute{type:'jeans'})-[:COLOR]->(jeansColor:Color:Attribute{type:'red'})
(jeansColor)-[:SIZE]->(:Size:Attribute{type:'small'})-[:QUANTITY]->(:Stock{quantity:2})
(jeansColor)-[:SIZE]->(:Size:Attribute{type:'large'})-[:QUANTITY]->(:Stock{quantity:4})

在此模型中,层次结构中的每个连续节点仅具有单个父节点。 :“红色”类型的颜色节点仅适用于“牛仔裤”的“服装”节点,还有其他:不同层次结构中“红色”的颜色节点,用于不同类型的服装。类似地,:大小节点只在其层次结构中具有意义,因此上面的“小”和“大”尺寸仅适用于红色牛仔裤,并且:Stock节点也将特定于层次结构。我们正在使用第二个标签:属性:颜色和:大小节点,因此我们可以根据需要更一般地处理这些节点。

对每个级别的库存进行查询将使用可变长度关系:项目节点并将数量相加如下:

MATCH (:Clothing{type:'jeans'})-[*]->(item:Item)
RETURN sum(item.quantity) as stock

类型的查询将在另一个方向上工作(请注意,如果需要,我们可以使用:Attribute标签而不是:Color;)

MATCH (:Color{type:'red'})<-[*]-(clothing:Clothing)
RETURN collect(distinct clothing.type) as clothing

此模型需要相当严格的树,以及许多重复的节点(因为具有相同属性的节点需要跨树的不同分支复制)。

另一个要考虑的模型是属性节点(:服装,颜色,:大小等)与相关项直接关系,因此每个项都连接到适用于它的所有属性,类似于第1点中的Gabor的回答。

在这个模型中,每个属性节点只有一个,因此您不必处理节点重复,但随着数据库中项目数量的增加,匹配中完成的工作可能会变得更复杂,因为您将在所有与您正在搜索的属性相关联的项目的交叉点处查找项目节点(因此,要查找小红色牛仔裤,您将扩展到每个小型,红色和牛仔布属性节点中的所有项目,并且仅保留三者之间共同的那些)。

© www.soinside.com 2019 - 2024. All rights reserved.