Database Neo4j我需要重复的节点,还是可以重复使用相同的节点?
我的任务是研究Neo4j以满足我们的业务需求。我已经创建了一些非常小的图来适应密码语法 我们有一个场景,用户将能够通过许多选项进行搜索,这些选项需要显示其相关数据,并在过滤结果时跟踪这些可用的库存项目。作为一个简单的例子(但与我们需要的设计相同)。我们可能有4件衣服(T恤、毛衣、牛仔裤、衬衫),用户可以选择其中一件来显示其尺寸和颜色等,并跟踪库存数量。但是,用户应该能够首先选择尺寸或颜色,而不是显示不同的项目(t恤、牛仔裤等)。基本上不同的组合取决于选择的内容 牛仔裤(库存20件)>红色(6件)>小号(2件)或大号(4件),牛仔裤>绿色>小号或大号,小号>红色>t恤,衬衫,绿色>大号>t恤 在这种情况下,是否需要为每个项目重复颜色和大小节点,或者我可以只创建一次并重用它们?这是我有点困惑的事情。对于一个选项节点,我们可能会有150多个(国家列表)选项,如果每个选项都有自己独特的相关节点(但对于其他选项,作为新节点重复),那么会有很多重复的选项吗?我们可以有超过一百万个节点 对不起,如果这是一个愚蠢的问题!只是想收集一下Neo4j中是否有处理此类用例的特殊方法Database Neo4j我需要重复的节点,还是可以重复使用相同的节点?,database,search,neo4j,tree,cypher,Database,Search,Neo4j,Tree,Cypher,我的任务是研究Neo4j以满足我们的业务需求。我已经创建了一些非常小的图来适应密码语法 我们有一个场景,用户将能够通过许多选项进行搜索,这些选项需要显示其相关数据,并在过滤结果时跟踪这些可用的库存项目。作为一个简单的例子(但与我们需要的设计相同)。我们可能有4件衣服(T恤、毛衣、牛仔裤、衬衫),用户可以选择其中一件来显示其尺寸和颜色等,并跟踪库存数量。但是,用户应该能够首先选择尺寸或颜色,而不是显示不同的项目(t恤、牛仔裤等)。基本上不同的组合取决于选择的内容 牛仔裤(库存20件)>红色(6件)
非常感谢您的帮助和建议。:) 本质上,这个问题可以追溯到ER建模中良好的旧属性与实体问题
n
,您需要发出以下查询:MATCH(r:color{name:'red'}CREATE(n)-[:HAS_color]>(r)
。要选择所有红色节点,请使用MATCH(n:item)-[:HAS_color]>(:color{name:'red'})
。这种方法可以轻松选择所有可用的颜色,例如MATCH(c:color)返回不同的c
MATCH(:Item{color:'red')
),列出可用的颜色可以通过MATCH(n)返回不同的n.color
总之,与大多数数据建模问题一样,您可能需要经过几次迭代才能获得正确的数据模型,并且可能还需要进行一些基准测试/性能调整。幸运的是,Neo4j使使用不同的数据模型进行实验变得非常容易。创建数据模型的方法通常有很多种,您可以必须权衡利弊,找出最有效的方法 考虑的一个方面,属性(属性)与实体,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})
在此模型中,层次结构中的每个连续节点只有一个父节点。类型为“红色”的:Color节点仅适用于“牛仔裤”的:Clothing节点,不同类型的衣服在不同层次结构中会有其他:Color节点用于“红色”。类似地,:Size节点仅在其层次结构中有意义,因此,上面的“小”和“大”尺寸仅适用于红色牛仔裤,并且:Stock节点也将特定于层次结构。我们在:Color和:Size节点上使用第二个label:Attribute,因此如果需要,我们可以更一般地处理这些节点
每一级的库存查询都将使用可变长度关系,下至:Item节点,并将数量相加,如下所示:
MATCH (:Clothing{type:'jeans'})-[*]->(item:Item)
RETURN sum(item.quantity) as stock
对类型的查询将朝另一个方向进行(注意,如果需要,我们可以在此处使用:属性标签而不是:颜色):
MATCH(:Color{type:'red'})这太棒了,谢谢!因此我可以有效地拥有一个国家节点,将所有不同的国家作为属性?即创建(国家:国家{uk:'uk',美国:'usa,法国:})依此类推?如果我对所有节点及其各自的属性执行此操作,这肯定会使数据模型更简洁!基本上,当选择选项时,我们的应用程序将动态筛选这些结果,因此需要尽可能快地获得结果。您是否建议使用具有属性的节点作为枚举?这将适用于pap呃,但这绝对不是一个好的做法。这样做的好处是什么?(相对于将它们作为枚举存储在Java代码中).我认为由于我们对Neo4j缺乏了解,我们的团队正试图让事情变得简单,但我们当然不想遵循糟糕的设计。我想我的想法是让属性与用户可以在应用程序中选择的选项相匹配?即,如果用户选择英国,我们将对此进行匹配,并作为用户继续添加到查询中选择更多选项(颜色、项目、大小等)但我不确定性能影响是什么。我们希望通过遍历树来过滤结果,然后在最后查询我们的MemSQL数据库以检索详细数据。Neo4j的属性图模型允许您存储数组,因此您可以使用create(:Countries{Countries:['UK'、'USA'、'France']})
。我不确定这是否有用——理想情况下,这不应该在数据库中。沿着树查询是一个有趣的想法,因为这本质上是一个可以存储在图形数据库中的索引(如果出于性能原因需要)。但是,要使其正常工作,用户必须遵循
MATCH (:Color{type:'red'})<-[*]-(clothing:Clothing)
RETURN collect(distinct clothing.type) as clothing