有没有办法在Neo4j中建模类型层次结构?例如,如果我想建立一个汽车的类层次结构,我可能有一个基本类型“汽车”,然后有扩展它的子类,如“SportCar”等。
我希望能够创建“SportCar”的实例,但运行查询以获取所有“Car”。这可能吗?如果是这样,技术是什么?
我认为我要做的是创建一个“标签层次结构” - 但我不认为neo4j支持它。
答案 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三重商店之间的差距很快就会变得更小。因此,在选择其中一个之前,您应该仔细设置数据库的要求。
希望这有帮助。