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



假设我正在创建标记为

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 中基于上述层次结构(节点的多个标签(设置模型类

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

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

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

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描述的方法的另一种观点。

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

我认为迈斯泰尔迈尔的第二种方法不符合您对产品目录的需求。最多,如果你愿意

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

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

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

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

最新更新