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

时间:2019-11-28 18:28:16

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

假设我要创建的手机和平板电脑产品标签为

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)

哪种模型是产品目录的首选模型?请针对该用例展示一些有关图形建模的见解。

3 个答案:

答案 0 :(得分:2)

由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类模型直接反映了您想通过标签表示的层次结构。

第二种方法可以通过类似{p>的@Relationship映射来实现

@NodeEntity
public class CommunicationDevice {

    @Relationship("SubType")
    Set<Electronics> electronics;
}

因此不会有任何继承,但是每个类都表示一个节点“类型”。

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

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

答案 1 :(得分:0)

这是基于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

因此,我建议第一种方法。

答案 2 :(得分:0)

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