Sik*_*e12 4 neo4j graph-databases cypher
显然,似乎以下WHERE子句不起作用,因为我们的查询中有两个关系(WorksAt和ResponsibleFor).如果只有一种关系,那么这就像魔法一样.在下面的查询中,查询返回部门科学中的所有课程,但它不会过滤掉Maria Smith教授的课程.我想做的只是获得在科学系工作的Maria Smith教授的课程.我遇到了似乎是潜在候选条款的WITH和Start子句,使其可以在将查询的一部分过滤掉之前将其发送到另一部分.
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
Run Code Online (Sandbox Code Playgroud)
有很多方法可以为这只特殊的猫提供皮肤.让我们分解吧.
找一个名为'Maria Smith'的导师,该导师在'科学'部门工作
MATCH (d:Department)<-[:WorksAt]-(t:Tutor)
WHERE d.name = 'Science' AND t.name = 'Maria Smith'
RETURN t
Run Code Online (Sandbox Code Playgroud)
找到导师教授的课程
MATCH (t:Tutor)-[:ResponsibleFor]->(c:Courses)
RETURN t.name, c
Run Code Online (Sandbox Code Playgroud)
将这两者结合起来,以获得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
Run Code Online (Sandbox Code Playgroud)
这也可以写成
MATCH (d:Department { name : 'Science' })<-[:WorksAt]-(t:Tutor { name : 'Maria Smith' })
WITH t
MATCH (t)-[r:ResponsibleFor]->(c:Courses)
RETURN t.name, r, c
Run Code Online (Sandbox Code Playgroud)
为了最大化查询性能,您可以使用模式索引快速找到Department和Tutor节点.你在做这个吗?要创建索引使用
CREATE INDEX ON :Department(name)
CREATE INDEX ON :Tutor(name)
Run Code Online (Sandbox Code Playgroud)
分别运行这些行.
另外,如果您想要列出每个导师所教授的课程,如上面第二个查询中所建议的那样,您可以使用以下查询来汇总每个导师的课程.
MATCH (t:Tutor)-[:ResponsibleFor]->(c:Courses)
RETURN t.name as CourseTutor, collect(c.name) as CourseName
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.