Graph 在节点或链接中定义关系?
我正在学习nosql数据库和neo4j。我想知道什么时候应该在节点或链接中定义关系 例如:Graph 在节点或链接中定义关系?,graph,neo4j,spring-data-neo4j,Graph,Neo4j,Spring Data Neo4j,我正在学习nosql数据库和neo4j。我想知道什么时候应该在节点或链接中定义关系 例如: (教师)-[:教学]->(学生) 或 (Person)-[:TEACHS]->(Person) 我知道这不是我问题的好例子。但我认为这在Neo4j或图论中一定是一个重要的话题,但我找不到关于这个话题的例子或讨论…我认为这取决于你的领域。两者 (teacher:Person:Teacher)-[:TEACHES]->(student:Person:Student) 定义三个标签-人员、教师和学生。这
(教师)-[:教学]->(学生)
或
(Person)-[:TEACHS]->(Person)
我知道这不是我问题的好例子。但我认为这在Neo4j或图论中一定是一个重要的话题,但我找不到关于这个话题的例子或讨论…我认为这取决于你的领域。两者
(teacher:Person:Teacher)-[:TEACHES]->(student:Person:Student)
定义三个标签-人员
、教师
和学生
。这有助于定义遍历。但是,如果您想在关系级别上修剪遍历,也可以这样做
(teacher:Person)-[:TEACHERS_TEACHES_STUDENT]->(student:Person)
从而隐含了节点的类型。虽然出于语义和遍历的原因,关系类型很好地使用,但它们的数量并不是无限的,使用Regexp等遍历它们也不是很好。因此,不要将关系值编码为日期之类的关系类型(例如,
[:从2013年教到2014年教)
)我认为这取决于你的领域。两者
(teacher:Person:Teacher)-[:TEACHES]->(student:Person:Student)
定义三个标签-人员
、教师
和学生
。这有助于定义遍历。但是,如果您想在关系级别上修剪遍历,也可以这样做
(teacher:Person)-[:TEACHERS_TEACHES_STUDENT]->(student:Person)
从而隐含了节点的类型。虽然出于语义和遍历的原因,关系类型很好地使用,但它们的数量并不是无限的,使用Regexp等遍历它们也不是很好。所以,不要把关系值编码成日期之类的关系类型(例如<代码> [Studio.Fux2013toto2014] )/P> < P>最好的出发点是考虑需要运行的查询。使用这些来指导您表示域的方式,而不是将其视为抽象的建模问题 例如,你可以决定最重要的问题是:“给定一个老师的名字,他们有多少学生?” 这是表示此查询的最简单方法,因此无需使用节点标签使模型复杂化 但是你可能会发现你需要一份所有老师的名单,在这一点上你可以引入一个标签
MATCH (t:Teacher) RETURN t.name
或者,您甚至可能会发现,出于性能原因,第一次查询需要一个标签
MATCH (:Teacher {name: {"Bob"})-[:TEACHES]->(p) RETURN count(p)
但确实值得一试,不要在前面做太多的建模,不要在模型中包含可能不必要的东西。您会发现,这将导致一个更简单、更灵活的模型
这就提出了一个问题,即如何在模型更改时修改数据。您通常会发现,有一系列安全、简单的重构,您可以像重构代码一样进行。在这种情况下,您需要将标签添加到:关系开始的所有节点
MATCH (t)-[:TEACHES]->() SET t:Teacher
最好的出发点是考虑需要运行的查询。使用这些来指导您表示域的方式,而不是将其视为抽象的建模问题
例如,你可以决定最重要的问题是:“给定一个老师的名字,他们有多少学生?”
这是表示此查询的最简单方法,因此无需使用节点标签使模型复杂化
但是你可能会发现你需要一份所有老师的名单,在这一点上你可以引入一个标签
MATCH (t:Teacher) RETURN t.name
或者,您甚至可能会发现,出于性能原因,第一次查询需要一个标签
MATCH (:Teacher {name: {"Bob"})-[:TEACHES]->(p) RETURN count(p)
但确实值得一试,不要在前面做太多的建模,不要在模型中包含可能不必要的东西。您会发现,这将导致一个更简单、更灵活的模型
这就提出了一个问题,即如何在模型更改时修改数据。您通常会发现,有一系列安全、简单的重构,您可以像重构代码一样进行。在这种情况下,您需要将标签添加到:关系开始的所有节点
MATCH (t)-[:TEACHES]->() SET t:Teacher
谢谢你的回复!如果我想得到一份没有标签的老师名单。我还可以使用MATCH(t)-[:teachs]->()返回t.name
。哪个更好?如果我们使用标签,是否存在性能问题??谢谢你可以这样做——只要你不需要考虑失业教师:-)。使用标签应该不会有任何性能问题。谢谢您的回复!如果我想得到一份没有标签的老师名单。我还可以使用MATCH(t)-[:teachs]->()返回t.name
。哪个更好?如果我们使用标签,是否存在性能问题??谢谢你可以这样做——只要你不需要考虑失业教师:-)。使用标签应该不会有任何性能问题。谢谢您的回复:)谢谢您的回复:)