Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j设计选择:关系与节点_Neo4j_Cypher_Spring Data Neo4j - Fatal编程技术网

Neo4j设计选择:关系与节点

Neo4j设计选择:关系与节点,neo4j,cypher,spring-data-neo4j,Neo4j,Cypher,Spring Data Neo4j,我正在处理以下情况:许多城市之间存在许多旅行。两者都有不同的性质。例如,城市有一个名字和经过城市的旅行次数,而旅行有距离和时间 Neo4j中的“最佳实践”是什么 a) 将所有城市和出行添加为节点,并通过“STARTED_AT”和“ENDS_IN”关系将出行连接到起点和终点节点 或 b) 仅将城市添加为节点,并将每个行程表示为两个节点之间的关系。这意味着节点之间存在许多相同的关系,唯一的区别是它们具有其他属性 可能有用的信息:我们只需要进行各种查询。无需插入 谢谢 我想说,这实际上取决于您对这些旅

我正在处理以下情况:许多城市之间存在许多旅行。两者都有不同的性质。例如,城市有一个名字和经过城市的旅行次数,而旅行有距离和时间

Neo4j中的“最佳实践”是什么

a) 将所有城市和出行添加为节点,并通过“STARTED_AT”和“ENDS_IN”关系将出行连接到起点和终点节点

b) 仅将城市添加为节点,并将每个行程表示为两个节点之间的关系。这意味着节点之间存在许多相同的关系,唯一的区别是它们具有其他属性

可能有用的信息:我们只需要进行各种查询。无需插入


谢谢

我想说,这实际上取决于您对这些旅行的建模方式,假设我们可以将其概括为(城市)-[trip]->(城市)。请注意,neo4j的关系总是有方向的,因此我们可以继续在城市之间添加无限数量的出行,而不必为每次出行重新定义每个城市——这实际上回答了(a)顺便说一下,我们不需要定义它的起点和终点关系对您来说很有用


“这意味着节点之间存在许多相同的关系”我认为最好将行程存储为节点,因为关系属性无法编制索引,而且执行更复杂的查询(如按时间查找最短路线)会很慢,因此如果您按ID或其他方式搜索行程,则需要将其存储为节点

另一方面,可以为使用关系设置参数,因为这样可以充分利用的加权图搜索函数


判断某个事物是否应该是节点或关系的一个好方法是问自己“这里还有其他有意义的关系吗?”如果你说的是两个城市是否相连,那么一种关系就更有意义,因为它们要么是,要么不是。如果你说的是公路旅行,那么旅行可以经过多个城市,可以有参与者(或团队)参加,也可以有一个所有者。在这种情况下,为了将来的灵活性,节点将更易于维护。

行程是预定义的列表吗?或者你能从任何一个城市到任何其他连接的城市旅行吗?如果是后者,则在查询时动态计算时间/距离可能会更有效,因为缓存这些值会使数据库成倍增长。@Tezra这是一个预定义的列表!