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

时间:2017-12-30 19:15:04

标签: database search neo4j tree cypher

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

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

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

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

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

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

2 个答案:

答案 0 :(得分: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

  3. 实施列出可用颜色

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

答案 1 :(得分: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

类型的查询将在另一个方向上工作(注意我们可以使用:属性标签而不是:如果我们想要的话,这里是颜色):

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

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

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

在此模型中,每个属性节点只有一个,因此您不必处理节点重复,但随着数据库中项目数量的增加,匹配中的工作可能会得到更复杂,因为你会在所有与你正在寻找的属性相关的项目的交叉处寻找项目节点(所以为了找到小红色牛仔裤你会扩展到每个小红色的所有项目,和jean属性节点,只保留三者之间的共同点。)