【问题标题】:Using Where clause in Multiple relationships in Neo4j在 Neo4j 的多个关系中使用 Where 子句
【发布时间】:2015-11-06 10:37:15
【问题描述】:

显然,下面的 WHERE 子句似乎不起作用,因为我们的查询中有两个关系(WorksAt 和 ResponsibleFor)。如果只有一种关系,那么这将像魔术一样起作用。在下面的查询中,查询返回科学系的所有课程,但它不会过滤掉不是 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

【问题讨论】:

  • 看起来不错。尝试返回 * 而不是 c,r
  • 除此之外,您确定所有案例的标签、属性和关系类型都匹配吗?
  • @DaveBennett return * 将带来与 return c,r 相同的结果。我知道,标签、属性和关系类型也在案例上匹配,因为我知道 Neo4j Cypher 查询不仅对查询语法而且对我们输入的值也是区分大小写的
  • 对不起,我看错了

标签: neo4j cypher graph-databases


【解决方案1】:

有很多方法可以给这只猫剥皮。让我们分解一下。

找到在“科学”系工作的名叫“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

希望这会有所帮助。

【讨论】:

  • 嗨@ceej 谢谢你的回答。一旦我完全测试它,我会告诉你的。
【解决方案2】:

很好的崩溃。有关此类查询的性能详细信息,请参阅 Wes Freeman 的 Pragmatic Cypher Optimization。在设置匹配时,从较小的节点集开始,向较大的节点集努力(Wes 规则 4)。

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多