2015-11-06 34 views
3

顯然,似乎下面的WHERE子句不起作用,因爲我們在查詢中有兩個關係(WorksAt和ResponsibleFor)。如果只有一種關係,那麼這就像魔術一樣工作。在下面的查詢中,查詢返回部門科學中的所有課程,但它不會過濾未由Maria Smith授課的課程。我想要做的只是獲得在科學部門工作的瑪麗亞史密斯教授的課程。 我遇到了WITH和Start Clause,它們似乎是潛在的候選子句,它使得它可以在將查詢的一部分發送給另一部分之前過濾掉其中的一部分。
http://neo4j.com/docs/stable/query-with.html
但我還沒有能夠把握這個概念呢。任何人尋求幫助?在Neo4j中使用多個關係中的Where子句

MATCH (d:Department)<-[w:WorksAt]-(t:Tutor)-[r:ResponsibleFor]->(c:Courses) 
WHERE d.name='Science' 
AND t.name='Maria Smith' 
return c,r 
+0

看起來不錯。嘗試返回*而不是c,r –

+0

除此之外,你確定所有的情況都符合標籤,屬性和關係類型嗎? –

+0

@DaveBennett返回*將帶來與返回c,r相同的結果。此外,標籤,屬性和關係類型與案例相匹配,因爲我知道Neo4j Cypher查詢不區分大小寫,而且查詢語法不區分大小寫,但也包含我們放入的值 – Sike12

回答

5

有很多方法可以爲這隻特定的貓蒙皮。讓我們分解它。

找到他的名字是「瑪麗亞·史密斯」,在「科學」部門

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 

希望這會有所幫助。

+0

嗨@ceej謝謝你你的答案。一旦我完全測試,我會讓你知道。 – Sike12

1

細分。有關此類查詢的性能詳細信息,請參閱Wes Freeman的Pragmatic Cypher Optimization。在建立比賽時,先從較小的節點集開始,朝着更大的(Wes的規則4)工作。

+0

謝謝@HieroB。 – Sike12