Neo4j 我们应该使用节点特定关系还是节点不可知关系?

Neo4j 我们应该使用节点特定关系还是节点不可知关系?,neo4j,cypher,spring-data-neo4j,Neo4j,Cypher,Spring Data Neo4j,我尝试从Spring数据Neo4j连接各种节点类型对于链接不同节点类型的类似关系,是否建议(或不建议)使用相同的关系类型? 例如,如果我们有一个Driver类(用@NodeEntity注释),并且我们希望对驾驶员可以驾驶不同车辆(例如汽车和自行车)的事实进行建模,那么这是否更好: @RelatedTo(elementClass=CarNode.class,type=“drives”,direction=OUTGOING) 私家车; @RelatedTo(elementClass=BikeNode

我尝试从Spring数据Neo4j连接各种节点类型对于链接不同节点类型的类似关系,是否建议(或不建议)使用相同的关系类型?

例如,如果我们有一个Driver类(用
@NodeEntity
注释),并且我们希望对驾驶员可以驾驶不同车辆(例如汽车和自行车)的事实进行建模,那么这是否更好:

@RelatedTo(elementClass=CarNode.class,type=“drives”,direction=OUTGOING)
私家车;
@RelatedTo(elementClass=BikeNode.class,type=“drives”,direction=OUTGOING)
私人自行车;
因为驾驶员可以驾驶不同类型的车辆,或者我们应该在关系中指出车辆的类型:

@RelatedTo(elementClass=CarNode.class,type=“drivesCar”,direction=OUTGOING)
私家车;
@RelatedTo(elementClass=BikeNode.class,type=“drivesBike”,direction=OUTGOING)
私人自行车;
第一种可能性在语义上似乎更正确,但在整个图中使用特定关系可以允许更快的遍历(无需测试节点类型),这似乎是合乎逻辑的

如果通用关系更好,如何使用密码查询仅获取汽车集或自行车集?


谢谢

通常,建议对关系类型进行详细说明

主要原因是您的查询将变得更便宜。例如,假设您想查询给定驾驶员驾驶的所有自行车。如果是泛型关系类型
驱动器
,则在密码中将其解析为:

start d=node:driver(name=<driverName>)
match (d)-[:drives]->(vehicle)
where vehicle.__type__ = 'Bike'
return vehicle
start d=节点:驱动程序(名称=)
匹配(d)-[:驱动器]->(车辆)
车辆位置。\类型\自行车
返回车辆
而对于详细的关系类型:

start d=node:driver(name=<driverName>)
match (d)-[:drivesBike]->(bike)
return bike
start d=节点:驱动程序(名称=)
匹配(d)-[:驱动自行车]->(自行车)
回程自行车

第二个更便宜,因为你不需要穿过非自行车。在第一种情况下,你是贪婪的遍历,然后应用过滤器

> P> >在斯特凡的回答中加上一点:你可能会考虑同时拥有一个通用的<代码>驱动程序>代码>和一个更具体的<代码>驱动程序> />代码> <代码>驱动程序。< /代码>可能会有一种情况,你只需要检索一个人驾驶的所有车辆,为此…你有
驱动器。
如果你想要所有的自行车骑手,那么就有
驱动器驱动器驱动器。
如果你有具体的和通用的关系,你可以以最佳方式查询这两种方式,并且拥有额外的关系不会真正影响你的数据库大小(虽然它在代码方面增加了一点,但添加了两个关系链接。请记住,如果您只有特定的驾驶员关系,您将有一些类型的OR查询,并调用所有驾驶员类型,并且您需要在每次添加新车型时更新查询。在这种情况下,使用通用
d更方便rives
关系


这一想法实际上在书中被提到。你可以在那里读到更多关于这种模式的信息。

如果我使用Spring Data Neo4j和
@RelatedTo
注释,那么使用驱动器和drivesCar是不可能的,因为它要么会导致
重复注释
错误,要么会导致“汽车”的重复集合…这是SDN的一个限制吗?…我不知道Neo4j的Spring数据,但是…节点之间需要两个不同的关系,而不是一个具有两种类型的关系。Spring数据当然应该支持这一点,因为图在节点之间通常有多个关系。您可以可变地将图形实体类扩展到将不同的含义映射到neo4j中的一种关系类型。顺便说一句,除非您有特定的性能问题,否则我不会担心通用/特定的,而是现实的。计算机成本是较小的问题,特定于您的模型和图形消费习惯,但设计师/开发人员/用户的头痛是普遍的,因此,直到您尝试为止没有理由不这样做,你应该是一个现实主义者。我通常不骑自行车,但我可能会驾驶一辆车,即使它碰巧是一辆自行车。@jjaderberg我同意速度与头痛的考虑。从技术上讲,你如何在不使用多种关系类型的情况下映射不同的含义?这是否意味着拥有一辆
自行车扩展了车辆
在收集的车辆上有一个“驱动器”吗?你能添加一个新的答案吗?谢谢!