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

时间:2014-07-21 19:24:13

标签: inheritance graph neo4j polymorphism data-modeling

有没有办法在Neo4j中建模类型层次结构?例如,如果我想建立一个汽车的类层次结构,我可能有一个基本类型“汽车”,然后有扩展它的子类,如“SportCar”等。

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

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

3 个答案:

答案 0 :(得分:12)

保罗,

首先,我建议你阅读“图形数据库”,这是一本免费的O'Reilly电子书,可在this link获得。

快速回答一下,有很多方法可以做到这一点,最好的选择取决于你想要解决的问题。一种方法是构建一个“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

您也可以在每个节点上放置Car和SportCar(以及LuxoCar等)标签。这只是众多方法中的两个。

恩典与和平,

吉姆

答案 1 :(得分:2)

所以我想出的壁橱就是这个例子。

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

create (c:CarType{Code:"Car"})
create (sc:CarType{Code:"SportCar"})
create (sc)-[:SubCarOf]->(c)

步骤2:创建“SportCar”的实例并记录(通过关系属性)它是“CarType”。

merge (sc:CarType{Code:"SportCar"})
create (i:SportCar)
create (i)-[:CarType]->(sc)

步骤3:编写一个查询,查找从“Car”派生的所有“CarType”以及任何只是“Car”类型的查询,然后查找这些实例。

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

答案 2 :(得分:1)

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

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

CREATE(BMW325d:Car:PassengerCar:DieselCar)
CREATE(Porsche911:Car:SportsCar:...)

2)创建本体

对类层次结构建模的第二种方法是使用本体。虽然Neo4j将数据建模为属性图,而且本体更适合RDF Triple Stores,但有一些方法可以使用它们。

您可以使用Protégé(开源)创建本体。然后将Ontology保存在.owl-File中,并使用此Plugin将其上传到Neo4j。 之后,您将Neo4j中的节点断言为Protégé中创建的Metagraph。更详细的描述被描述为here

有关此主题的更多内容......

出于您的目的,RDF三重存储是一个有趣的选项,特别是如果您想为数据添加语义,例如使用推理和继承。我建议仔细研究一下RDF Triple Stores,它们也是图形 - 但它们将数据存储在三元组中(主题 - 谓词 - 对象)而不是节点和关系。 Top Braid Composer是一个“易于学习”的工具,可以开始使用它们。

尽管如此,我希望Property Graphs和RDF三重商店之间的差距很快就会变得更小。因此,在选择其中一个之前,您应该仔细设置数据库的要求。

希望这有帮助。