2012-11-19 75 views
1

我試圖創建一個查詢,帶給我一些節點有一組節點的精確匹配的節點。在這種情況下,我想帶上帶有標籤的體驗,例如,什麼體驗有標籤:「食物」,「夜生活」和「文化」。Neo4j的Cypher支架查詢找到精確匹配(並且不是OR)

我的查詢「工作」,但使用或代替並把結果。我該如何解決它?

我不知道如果我使用的

@Query("START experience = node:__types__(className=\"...\"), tags = node({0}) " + 
    "WHERE experience-[:TAGGED]->tags " + 
    "RETURN experience") 
public Set<Experience> findExperiencesByTags(Set<Long> tagIds); 

去正確的做法我使用Spring 2.0.1數據和Neo4j的1.6.3。

回答

1

嘗試將其分爲3個單獨的匹配短語:

"MATCH experience-[:TAGGED]->tags1, experience-[:TAGGED]->tags2, experience-[:TAGGED]->tags3, " + 
"WHERE tags1.tag='food' AND tags2.tag='culture' AND tags3.tag='nightlife' " 
+0

我試圖做一些更通用。我收到一組標籤ID,比如這個方法的參數,我必須用這些來創建我的「where」子句...... –

+0

哦,我現在看到了。難道你不能簡單地將輸入標籤集分成不同的定義嗎?而不是「tags = node({0})」嘗試將輸入標籤數組首先分析到單獨的起始節點中 - tag1 = node({tagIds [0]}),tag2 = node({tagIds [1]}),tag3 = node({tagIds [2]}),...直到tagIds結束。比我上面寫的節點(沒有where /和子句)匹配節點。 – ulkas

+0

我創建了一個按照@ulkas建議的動態查詢,它的工作原理! –

1

我@ulkas

如果你真的想在標籤,你可以試試這個任意數傳同意,但它會可能表現不如明確的匹配。

START tags = node({0}) 
MATCH experience-[:TAGGED]->tags 
WITH experience, count(*) as cnt 
WHERE cnt = length({0}) 
RETURN experience