在Neo4j中使用多个关系中的Where子句

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)

cee*_*eej 5

有很多方法可以为这只特殊的猫提供皮肤.让我们分解吧.

找一个名为'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)

希望这可以帮助.