假设我要创建的手机和平板电脑产品标签为
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)
哪种模型是产品目录的首选模型?请针对该用例展示一些有关图形建模的见解。
答案 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
节点,且所有属性都来自Laptop
,Electronic
和CommunicationDevice
。
因此,我建议第一种方法。
答案 2 :(得分:0)
这篇文章 (https://medium.com/neo4j/graph-modeling-labels-71775ff7d121) 由 Neo4j 的一位主要人员创建,建议不要使用标签对类层次结构进行建模。