【问题标题】:neo4j data modelling multiple labels for a node with hierarchyNeo4j 数据建模具有层次结构的节点的多个标签
【发布时间】:2020-03-24 10:47:22
【问题描述】:

假设我正在创建标记为的手机和平板电脑产品

create (n:Mobiles:Electronics:Communication Devices {name:'XXXX'}); create (n:Tablets:Electronics:Communication Devices {name:'YYYY'});

以及之后的笔记本电脑。所以,以下

create (n:Laptops:Electronics {name:'AAAA'});

  • 我可以根据定位的标签维护本体/检索层次结构吗?
  • 如果是这样,如何在Spring-data-starter-neo4j中根据上述层次结构(Node的多个标签)设置模型类

    或者

  • 我是否需要在层次结构中对图形本身进行建模

CREATE (:CommunicationDevices)-[:SubType]->(:Electronics)-[:SubType]->(:Mobiles)

哪一种是产品目录建模的首选方式?请展示有关此用例的图形建模的一些见解。

【问题讨论】:

    标签: neo4j data-modeling graph-databases spring-data-neo4j neo4j-ogm


    【解决方案1】:

    这篇文章 (https://medium.com/neo4j/graph-modeling-labels-71775ff7d121) 由 Neo4j 的一位主要人物创建,建议不要使用标签对类层次结构进行建模。

    【讨论】:

      【解决方案2】:

      这是基于 meistermeier 描述的方法的另一种观点。

      您如何为图表建模取决于您的数据以及稍后查询的内容。如果要为所有分层产品类别创建 Java 类,则可以使用继承方法(meistermeier 的第一种方法)。当您在产品类别中有专用属性时,这尤其有用,例如Electronics 中的“screenSize”或CommunicationDevice 中的“MAC”或MobilePhone 中的“gpsSensor”。按标签查询是有效的,即查询这些产品类别会很快。此外,您可以在根类 Product 或其他东西中建模常见属性,例如“productNumber”。

      我认为 meistermeier 的第二种方法不符合您对产品目录的需求。顶多,如果你喜欢

      @NodeEntity
      public class Laptop {
      
          @Relationship("BASE")
          Electronic electronic;
      }
      

      反之亦然,您必须为每台笔记本电脑创建一个Laptop、一个Electronic 和一个CommunicationDevice 节点。但在这种情况下,第一种方法更优雅,因为您将只有一个 Laptop 节点,其中包含来自 LaptopElectronicCommunicationDevice 的所有属性。

      因此我推荐第一种方法。

      【讨论】:

        【解决方案3】:

        Spring Data Neo4j/Neo4j-OGM 创建(或加载)的节点上可以有多个标签。

        让我先画出接口/类。

        @NodeEntity
        public interface CommunicationDevice {}
        
        @NodeEntity
        public class Electronics {}
        
        @NodeEntity
        public class Mobiles extends Electronics implements CommunicationDevice {}
        
        @NodeEntity
        public class Tablets extends Electronics implements CommunicationDevice {}
        
        @NodeEntity // here we do not want the label CommunicationDevice
        public class Laptops extends Electronics {}
        

        您可以看到Java类模型通过标签直接反映了您想要表达的层次结构。

        第二种方法可以通过@Relationship 之类的映射来实现

        @NodeEntity
        public class CommunicationDevice {
        
            @Relationship("SubType")
            Set<Electronics> electronics;
        }
        

        所以不会有任何继承,但每个类都代表一个节点“类型”。

        我的建议是,这实际上取决于您要存储的数据。在您的示例中,只有叶节点,没有数据,例如CommunicationDevice。 虽然第一个选项直接存储带有标签的产品,但第二个选项更多地反映了导航到产品的层次结构。

        我个人认为最好的方法是真正存储产品的路径/导航(第二种选择),而不仅仅是使用标签。否则,您的图表中将不会有真正的层次结构,只有标签,而只有在应用程序中。

        【讨论】:

        • 你建议使用第一个选项吗? (扩展和实现)。对不起,我没有得到你的最后一个段落/点。 @meistermeier
        • 不,我建议使用由关系建模的路径。但是之后就没有等级了。
        • link 对解决方案有帮助吗?你能看看这个并发表评论吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-03
        • 2019-11-19
        • 1970-01-01
        • 1970-01-01
        • 2017-07-20
        • 1970-01-01
        相关资源
        最近更新 更多