在 Neo4j 的多重关系中使用 Where 子句
Using Where clause in Multiple relationships in Neo4j
显然,以下 WHERE 子句似乎不起作用,因为我们的查询中有两个关系(WorksAt 和 ResponsibleFor)。如果只有一种关系,那么这将像魔术一样起作用。在下面的查询中,查询 returns 科学系的所有课程,但它不会过滤掉 Maria Smith 未教授的课程。我只想获得在科学系工作的 Maria Smith 教授的课程。
我遇到了 WITH 和 Start Clause,它们似乎是潜在的候选子句,可以在将查询的一部分发送到另一部分之前过滤掉查询的一部分。
http://neo4j.com/docs/stable/query-with.html
但我还没能掌握这个概念。有人愿意帮忙吗?
MATCH (d:Department)<-[w:WorksAt]-(t:Tutor)-[r:ResponsibleFor]->(c:Courses)
WHERE d.name='Science'
AND t.name='Maria Smith'
return c,r
有多种方法可以为这只猫剥皮。让我们分解一下。
查找在'Science'部门工作的'Maria Smith'导师
MATCH (d:Department)<-[:WorksAt]-(t:Tutor)
WHERE d.name = 'Science' AND t.name = 'Maria Smith'
RETURN t
查找导师教授的课程
MATCH (t:Tutor)-[:ResponsibleFor]->(c:Courses)
RETURN t.name, c
把这两个放在一起,就可以得到Scence系的Maria Smith教授的课程
MATCH (d:Department)<-[:WorksAt]-(t:Tutor)
WHERE d.name = 'Science' AND t.name = 'Maria Smith'
WITH t
MATCH (t)-[r:ResponsibleFor]->(c:Courses)
RETURN t.name, r, c
这也可以写成
MATCH (d:Department { name : 'Science' })<-[:WorksAt]-(t:Tutor { name : 'Maria Smith' })
WITH t
MATCH (t)-[r:ResponsibleFor]->(c:Courses)
RETURN t.name, r, c
为了最大限度地提高查询性能,您可以使用架构索引来快速定位您的 Department 和 Tutor 节点。你在做这个吗?要创建索引,请使用
CREATE INDEX ON :Department(name)
CREATE INDEX ON :Tutor(name)
运行 这些行分开。
顺便说一下,如果您想列出每位导师教授的课程,如上面第二个查询中所建议的,您可以使用以下查询来汇总每位导师的课程。
MATCH (t:Tutor)-[:ResponsibleFor]->(c:Courses)
RETURN t.name as CourseTutor, collect(c.name) as CourseName
希望对您有所帮助。
不错的分解。有关此类查询的性能详细信息,请参阅 Wes Freeman 的 Pragmatic Cypher Optimization。在设置匹配时,从较小的节点集开始向较大的节点集努力(Wes 规则 4)。
显然,以下 WHERE 子句似乎不起作用,因为我们的查询中有两个关系(WorksAt 和 ResponsibleFor)。如果只有一种关系,那么这将像魔术一样起作用。在下面的查询中,查询 returns 科学系的所有课程,但它不会过滤掉 Maria Smith 未教授的课程。我只想获得在科学系工作的 Maria Smith 教授的课程。
我遇到了 WITH 和 Start Clause,它们似乎是潜在的候选子句,可以在将查询的一部分发送到另一部分之前过滤掉查询的一部分。
http://neo4j.com/docs/stable/query-with.html
但我还没能掌握这个概念。有人愿意帮忙吗?
MATCH (d:Department)<-[w:WorksAt]-(t:Tutor)-[r:ResponsibleFor]->(c:Courses)
WHERE d.name='Science'
AND t.name='Maria Smith'
return c,r
有多种方法可以为这只猫剥皮。让我们分解一下。
查找在'Science'部门工作的'Maria Smith'导师
MATCH (d:Department)<-[:WorksAt]-(t:Tutor)
WHERE d.name = 'Science' AND t.name = 'Maria Smith'
RETURN t
查找导师教授的课程
MATCH (t:Tutor)-[:ResponsibleFor]->(c:Courses)
RETURN t.name, c
把这两个放在一起,就可以得到Scence系的Maria Smith教授的课程
MATCH (d:Department)<-[:WorksAt]-(t:Tutor)
WHERE d.name = 'Science' AND t.name = 'Maria Smith'
WITH t
MATCH (t)-[r:ResponsibleFor]->(c:Courses)
RETURN t.name, r, c
这也可以写成
MATCH (d:Department { name : 'Science' })<-[:WorksAt]-(t:Tutor { name : 'Maria Smith' })
WITH t
MATCH (t)-[r:ResponsibleFor]->(c:Courses)
RETURN t.name, r, c
为了最大限度地提高查询性能,您可以使用架构索引来快速定位您的 Department 和 Tutor 节点。你在做这个吗?要创建索引,请使用
CREATE INDEX ON :Department(name)
CREATE INDEX ON :Tutor(name)
运行 这些行分开。
顺便说一下,如果您想列出每位导师教授的课程,如上面第二个查询中所建议的,您可以使用以下查询来汇总每位导师的课程。
MATCH (t:Tutor)-[:ResponsibleFor]->(c:Courses)
RETURN t.name as CourseTutor, collect(c.name) as CourseName
希望对您有所帮助。
不错的分解。有关此类查询的性能详细信息,请参阅 Wes Freeman 的 Pragmatic Cypher Optimization。在设置匹配时,从较小的节点集开始向较大的节点集努力(Wes 规则 4)。