Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Neo4j我需要重复的节点,还是可以重复使用相同的节点?_Database_Search_Neo4j_Tree_Cypher - Fatal编程技术网

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

Database Neo4j我需要重复的节点,还是可以重复使用相同的节点?,database,search,neo4j,tree,cypher,Database,Search,Neo4j,Tree,Cypher,我的任务是研究Neo4j以满足我们的业务需求。我已经创建了一些非常小的图来适应密码语法 我们有一个场景,用户将能够通过许多选项进行搜索,这些选项需要显示其相关数据,并在过滤结果时跟踪这些可用的库存项目。作为一个简单的例子(但与我们需要的设计相同)。我们可能有4件衣服(T恤、毛衣、牛仔裤、衬衫),用户可以选择其中一件来显示其尺寸和颜色等,并跟踪库存数量。但是,用户应该能够首先选择尺寸或颜色,而不是显示不同的项目(t恤、牛仔裤等)。基本上不同的组合取决于选择的内容 牛仔裤(库存20件)>红色(6件)

我的任务是研究Neo4j以满足我们的业务需求。我已经创建了一些非常小的图来适应密码语法

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

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

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

对不起,如果这是一个愚蠢的问题!只是想收集一下Neo4j中是否有处理此类用例的特殊方法


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

本质上,这个问题可以追溯到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