当前位置: 首页 > 知识库问答 >
问题:

Neo4j数据建模具有层次结构的节点的多个标签

顾均
2023-03-14

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

创建(n:手机:电子:通信设备{名称:'XXXX'});创建(n:平板电脑:电子:通信设备{名称:'YYYY'});

然后是笔记本电脑。那么,下面

create(n:笔记本电脑:电子产品{name:'AAAA})

>

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

    创建(:通信设备)-[:子类型]-

    哪一种是建立产品目录模型的首选方法?请展示一些关于这个用例的图形建模的见解。


  • 共有3个答案

    方玄天
    2023-03-14

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

    芮念
    2023-03-14

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

    如何对图形建模取决于您的数据和以后查询的内容。如果要为所有分层产品类别创建Java类,可以使用继承方法(meistermeier的第一种方法)。当您在产品类别中具有专用属性时,这尤其有用,例如电子产品中的“屏幕大小”或通信设备中的“MAC”或手机中的“gpsSensor”。按标签查询是高效的,即可以快速查询这些产品类别。此外,您还可以在根类Product或其他对象中对诸如“productNumber”之类的公共属性进行建模。

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

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

    反过来说,您必须为每台笔记本电脑创建一个笔记本电脑、一个电子和一个通信设备节点。但在这种情况下,第一种方法更为优雅,因为您只有一个膝上型电脑节点,所有属性都来自膝上型电脑电子通信设备

    因此,我推荐第一种方法。

    程胡非
    2023-03-14

    在由Spring数据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;
    }
    

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

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

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

     类似资料:
    • 我有以下Java问题 我有以下通用类,它们可能被描绘为: 其中

    • 在Tableau中,可以构建层次结构以可视化数据。可以通过以下步骤在Tableau中创建它: 例如,考虑数据源,例如Sample-Superstore,以及它的维度和度量。 第1步: 首先转到工作表。然后, 选择一个维度,然后右键单击该维度以创建层次结构。 转到“层次结构(Hierarchy)”选项。 并且,单击下面屏幕截图中显示的“创建层次结构(Create Hierarchy)”选项。 第2步

    • 这是我想做的:将用户连接到他们观看的视频,就像用户- 我是如何做到的: CSV文件有2列,标题为用户和视频。用户下面是一个标识每个用户的数字,视频下面是一个标识每个视频的数字。一个用户对一个视频。有时用户的名字会在列表中再次出现在不同的视频中。有时视频编号会再次出现,因为它是由不同的用户观看的。 但是,这将返回关系用户在每个关系中查看1个视频。因此,每个用户和视频都有多个节点。 我想做的:创建更多

    • 我想使用py2neo的OGM来表示从一个节点类型到两个节点类型的关系。 这段关系的“结束”应该指向一辆车,而不是一栋房子。但显然py2neo并不关心那么多,而是像预期的那样将所有东西都存储在数据库中:一个人、一辆车和一栋房子通过拥有关系连接起来。 现在的问题是使用上面的类来检索节点和关系。当节点属性正确加载时,关系不是: 这导致: 此行为与类对象一致。 我如何在py2neo.ogm中用同一个类建模

    • 我们正在进行一场关于如何设计RESTendpoint的辩论。基本上可以归结为这个做作的例子。 假设我们有: 其中演员A是同一个演员。 这种分歧最终源于使用ember.js,它期望有一个特定的层次结构--不希望有多种方式来访问相同的数据(最终,这将真正导致少量的代码重复)。可以将ember.js映射为使用/actors/a,因此没有严格的技术限制,这实际上更多地是一个哲学问题。 我环顾四周,找不到任

    • 我需要创建一个新的A类节点,它与User节点有关系: 现在,假设我们有新节点A的以下数据: 我试图创建节点A,使新节点A与具有“id”:4和“nodeId”:“0002-0002”(唯一节点标识符)的用户的(现有)节点之间具有关系,但用户节点将字段“name”和“firstName”更新为。 我正在使用GraphRespository代理创建它: 有没有办法不进行此更新,只与用户节点建立关系?