Inheritance 如何在Neo4j中使用类型层次结构?

Inheritance 如何在Neo4j中使用类型层次结构?,inheritance,graph,neo4j,polymorphism,data-modeling,Inheritance,Graph,Neo4j,Polymorphism,Data Modeling,有什么方法可以在Neo4j中为类型层次结构建模吗?例如,如果我想构建一个汽车的类层次结构,我可能会有一个基本类型“Car”,然后有扩展它的子类,比如“SportCar”,等等 我希望能够创建“SportCar”的实例,但运行查询以获取所有“Car”。这可能吗?如果是,技术是什么 我想我要做的是创建一个“标签层次结构”-但我认为neo4j不支持它。Paul 首先,我建议您阅读“Graph Databases”,这是一本免费的O'Reilly电子书 作为一个快速的答案,有很多方法可以做这类事情,而最

有什么方法可以在Neo4j中为类型层次结构建模吗?例如,如果我想构建一个汽车的类层次结构,我可能会有一个基本类型“Car”,然后有扩展它的子类,比如“SportCar”,等等

我希望能够创建“SportCar”的实例,但运行查询以获取所有“Car”。这可能吗?如果是,技术是什么

我想我要做的是创建一个“标签层次结构”-但我认为neo4j不支持它。

Paul

首先,我建议您阅读“Graph Databases”,这是一本免费的O'Reilly电子书

作为一个快速的答案,有很多方法可以做这类事情,而最佳的选择取决于你试图解决的问题。一种方法是构造一个“Car”节点,然后使用类型化关系将“SportCar”节点与“Car”节点关联,如

CREATE (m:Car)
MATCH (m:CAR) WITH m CREATE (n:SportCar)-[:IS_A]->(m)
创建其他类型的汽车,并将其与汽车节点关联

然后,您可以通过

MATCH (m:Car)<-[:IS_A]-(n) RETURN n

MATCH(m:Car)所以我能想到的壁橱就是这个例子

步骤1:创建汽车类型的类型层次结构

create (c:CarType{Code:"Car"})
create (sc:CarType{Code:"SportCar"})
create (sc)-[:SubCarOf]->(c)
步骤2:创建一个“SportCar”实例,并(通过关系属性)将其记录为“CarType”

步骤3:编写一个查询,查找从“Car”派生的所有“CarType”和任何仅属于“Car”类型的“CarType”,然后查找这些类型的实例

match (c)-[:CarType]->(ct:CarType{Code:"Car"})
return c as Car
union
match (sct)-[:SubCarOf*]->(ct:CarType{Code:"Car"}), 
(c)-[:CarType]->(sct)
return c as Car

至少有两种方法可以做到这一点:

1)为每个对象使用多个标签

2)创建本体

建模类层次结构的第二种方法是使用本体。尽管Neo4j将数据建模为属性图和本体更适合RDF三重存储,但还是有一些方法可以使用它们

您可以使用Protégé(开源)创建本体。然后将本体保存在一个.owl文件中,并使用以下命令将其上载到Neo4j。 后记:将Neo4j中的节点断言到Protégé中创建的元图。描述了更详细的描述

有关此主题的更多信息…

就您的目的而言,RDF三元组存储是一个有趣的选择,特别是如果您希望向数据添加语义,比如使用推断和继承。我建议仔细研究RDF三元组存储,它们也是图形,但它们以三元组(主语-谓语-宾语)而不是节点和关系存储数据。Top Braid Composer是一款“易于学习”的工具,可用于开始使用它们

尽管如此,我希望属性图和RDF三重存储之间的差距很快会缩小,因为这是一种折衷。因此,在选择其中一个之前,您应该仔细设置对数据库的需求


希望这能有所帮助。

似乎与我在阅读了更多关于neo4j的内容后了解到的一点类似,那就是没有真正的“类型”系统。他们拥有的最接近的东西是他们所谓的“标签”,基本上就是你可以放在节点上的“标签”。因此,导航层次结构是完全可行的,但您必须以更具体的方式构造查询,因为对“类型”等没有现成的支持。AgensGraph(PostgreSQL fork扩展了graph DB功能)具有标签层次结构:是的,我知道您可以在创建节点时应用“IsA”关系,但这不允许您执行任何操作“匹配(c:汽车)返回c“并取回所有汽车,包括汽车的子类。我只是觉得neo4j不支持搜索中的继承。要明确的是,OrientDB确实支持这一点——我想这只是两个平台之间的一个关键区别。此外,标签方法无法扩展,当层次结构发生变化时,管理起来会很混乱——想象一下必须返回并更新所有以前的标签,等等。
match (c)-[:CarType]->(ct:CarType{Code:"Car"})
return c as Car
union
match (sct)-[:SubCarOf*]->(ct:CarType{Code:"Car"}), 
(c)-[:CarType]->(sct)
return c as Car
CREATE(BMW325d:Car:PassengerCar:DieselCar)
CREATE(Porsche911:Car:SportsCar:...)