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
Graph 在节点或链接中定义关系?_Graph_Neo4j_Spring Data Neo4j - Fatal编程技术网

Graph 在节点或链接中定义关系?

Graph 在节点或链接中定义关系?,graph,neo4j,spring-data-neo4j,Graph,Neo4j,Spring Data Neo4j,我正在学习nosql数据库和neo4j。我想知道什么时候应该在节点或链接中定义关系 例如: (教师)-[:教学]->(学生) 或 (Person)-[:TEACHS]->(Person) 我知道这不是我问题的好例子。但我认为这在Neo4j或图论中一定是一个重要的话题,但我找不到关于这个话题的例子或讨论…我认为这取决于你的领域。两者 (teacher:Person:Teacher)-[:TEACHES]->(student:Person:Student) 定义三个标签-人员、教师和学生。这

我正在学习nosql数据库和neo4j。我想知道什么时候应该在节点或链接中定义关系

例如:

(教师)-[:教学]->(学生)

(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
。哪个更好?如果我们使用标签,是否存在性能问题??谢谢你可以这样做——只要你不需要考虑失业教师:-)。使用标签应该不会有任何性能问题。谢谢您的回复:)谢谢您的回复:)