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

Pau*_*yer 9 polymorphism inheritance graph data-modeling neo4j

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

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

我认为我要做的是创建一个"标签层次结构" - 但我不认为neo4j支持.

Jim*_*ard 12

保罗,

首先,我建议你阅读"图形数据库",这是一个免费的O'Reilly电子书,可以在这个链接上找到.

作为答案的快速尝试,有很多方法可以做这种事情,最好的选择取决于你试图解决的问题.一种方法是构建一个"Car"节点,然后将你的"SportCar"节点与"Car"节点相关联,其类型关系就像

CREATE (m:Car)
MATCH (m:CAR) WITH m CREATE (n:SportCar)-[:IS_A]->(m)
Run Code Online (Sandbox Code Playgroud)

并创建其他类型的汽车,也将它们与汽车节点相关联.

然后,您可以找到所有汽车

MATCH (m:Car)<-[:IS_A]-(n) RETURN n
Run Code Online (Sandbox Code Playgroud)

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

恩典与和平,

吉姆

  • Ya我知道您可以在创建节点时应用"IsA"关系,但这不会让您执行"MATCH(c:Car)RETURN c"并取回所有汽车,包括汽车的子类汽车.我只是不认为neo4j支持搜索中的继承.需要明确的是,OrientDB支持这一点 - 我想这只是两个平台之间的关键区别.此外,标签方法不会扩展,并且在层次结构发生变化时管理会很糟糕 - 想象一下必须返回并更新所有以前的标签等. (5认同)

Gra*_*eer 9

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

\n\n

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

\n\n
CREATE(BMW325d:Car:PassengerCar:DieselCar)\nCREATE(Porsche911:Car:SportsCar:...)\n
Run Code Online (Sandbox Code Playgroud)\n\n

2)创建本体

\n\n

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

\n\n

您可以使用 Prot\xc3\xa9g\xc3\xa9 (开源)创建本体。然后,将本体保存在 .owl 文件中,并使用此插件将其上传到 Neo4j 。\n之后,您将 Neo4j 中的节点断言到在 Prot\xc3\xa9g\xc3\xa9 中创建的 Metagraph。这里有更详细的描述。

\n\n

有关此主题的更多信息...

\n\n

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

\n\n

尽管如此,我希望属性图和 RDF 三元组存储之间的差距很快就会变小,这是一种权衡。因此,在选择其中之一之前,您应该仔细设置对数据库的要求。

\n\n

希望这可以帮助。

\n