在Neo4j中有没有什么方法可以对类型层次结构进行建模?例如,如果我想构建一个汽车的类层次结构,我可能有一个基本类型“Car”,然后有扩展该类型的子类,如“SportCar”等。我希望能够创建“SportCar”的示例,但运行一个查询来获取所有“Car“的示例。这可能吗?如果可以,技术是什么?我想我尝试做的是创建一个“标签层次结构”--但我只是不认为neo4j支持这一点。
smdnsysy1#
保罗,首先,我建议您阅读“图形数据库”,这是一本免费的O'Reilly电子书,可在this link上获得。作为一个快速的答案,有很多方法来做这类事情,最好的选择取决于你试图解决的问题。一种方法是构造一个“Car”节点,然后用一个类型化的关系将你的“SportCar”节点与“Car”节点关联起来,如
CREATE (m:Car) MATCH (m:CAR) WITH m CREATE (n:SportCar)-[:IS_A]->(m)
并创建其他类型的汽车,同时将它们与Car节点相关联。然后您可以通过
MATCH (m:Car)<-[:IS_A]-(n) RETURN n
你也可以在每个节点上放置Car和SportCar(以及LuxoCar等)标签,这只是许多方法中的两种。恩典与平安,占
ql3eal8s2#
至少有两种方法可以做到这一点:
1)为每个对象使用多个标签
CREATE(BMW325d:Car:PassengerCar:DieselCar) CREATE(Porsche911:Car:SportsCar:...)
2)创建本体
第二种建模类层次结构的方法是使用本体。虽然Neo4j将数据建模为属性图,而本体更适合RDF三重存储,但仍有使用它们的方法。您可以使用Protégé(开放源代码)创建本体,然后将本体保存在一个.owl-File中,并使用Plugin将其上传到Neo4j中,然后将Neo4j中的节点Assert到Protégé中创建的Metagraph中,here中描述了更详细的描述。
关于此主题的更多信息...
对于您的目的,RDF三元存储是一个有趣的选择,特别是如果您想添加语义到您的数据,如使用推理和继承。我建议仔细看看RDF三元存储,这也是图形-但他们存储数据在三元组(主体- predicate -对象),而不是节点和关系。顶部编织器是一个“易学”-工具开始使用它们。尽管如此,我还是希望Property Graphs和RDF三元组存储之间差距会很快变小,因为这是一个权衡。所以在选择它们之前,你应该仔细地设置你对数据库的要求。希望这对你有帮助。
velaa5lx3#
所以我能想到的壁橱就是这个例子。步骤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”类型的“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
kgsdhlau4#
你可以考虑用合成来代替继承。
CREATE (c0:Car:SportsCar {colour: "yellow", brand: "Bugatti", country: "France"}), (c1:Car:LuxuryCar {colour: "red", brand: "Mercedes-Benz", country: "Germany"})
Car
MATCH (c:Car) RETURN c;
SportCar
MATCH (c:Car:SportsCar) RETURN c;
LuxuryCar
MATCH (c:Car:LuxuryCar) RETURN c;
4条答案
按热度按时间smdnsysy1#
保罗,
首先,我建议您阅读“图形数据库”,这是一本免费的O'Reilly电子书,可在this link上获得。
作为一个快速的答案,有很多方法来做这类事情,最好的选择取决于你试图解决的问题。一种方法是构造一个“Car”节点,然后用一个类型化的关系将你的“SportCar”节点与“Car”节点关联起来,如
并创建其他类型的汽车,同时将它们与Car节点相关联。
然后您可以通过
你也可以在每个节点上放置Car和SportCar(以及LuxoCar等)标签,这只是许多方法中的两种。
恩典与平安,
占
ql3eal8s2#
至少有两种方法可以做到这一点:
1)为每个对象使用多个标签
2)创建本体
第二种建模类层次结构的方法是使用本体。虽然Neo4j将数据建模为属性图,而本体更适合RDF三重存储,但仍有使用它们的方法。
您可以使用Protégé(开放源代码)创建本体,然后将本体保存在一个.owl-File中,并使用Plugin将其上传到Neo4j中,然后将Neo4j中的节点Assert到Protégé中创建的Metagraph中,here中描述了更详细的描述。
关于此主题的更多信息...
对于您的目的,RDF三元存储是一个有趣的选择,特别是如果您想添加语义到您的数据,如使用推理和继承。我建议仔细看看RDF三元存储,这也是图形-但他们存储数据在三元组(主体- predicate -对象),而不是节点和关系。顶部编织器是一个“易学”-工具开始使用它们。
尽管如此,我还是希望Property Graphs和RDF三元组存储之间差距会很快变小,因为这是一个权衡。所以在选择它们之前,你应该仔细地设置你对数据库的要求。
希望这对你有帮助。
velaa5lx3#
所以我能想到的壁橱就是这个例子。
步骤1:创建汽车类型的类型层次结构。
第2步:创建一个“SportCar”的示例,并记录(通过关系属性)它是“CarType”。
第3步:编写一个查询,查找所有从“Car”派生的“CarType“,以及任何仅属于“Car”类型的“CarType”,然后查找它们的示例。
kgsdhlau4#
成分
你可以考虑用合成来代替继承。
Car
SportCar
:LuxuryCar
: