2014-10-02 84 views
1

我想寫一個密碼查詢,它允許您傳入一組名稱作爲字符串來查找匹配的節點,然後返回每個節點的ID。我一直在玩弄語言和具有以下缺陷查詢上來:如何查找節點的子集並在密碼中返回它們的ID?

START person=node(*) 
WHERE HAS (person.name) 
WITH FILTER (name IN ['ryan','mike'] : person.name=name) AS matchedPersons 
RETURN ID(matchedPersons) 

Expected `matchedPersons` to be a node or relationship, but it was `` 

如果我回到matchedPersons而不是ID(matchedPersons),我得到這樣的結果:

+------------------------------------------+ 
| matchedPersons       | 
+------------------------------------------+ 
| ["ryan"] | 
| ["mike"] | 
| []          | 
+------------------------------------------+ 
3 rows 

在我的數據庫,我有三個人名有'ryan','mike'和'lucy'的節點。我想獲取與FILTER子句中定義的集合中的名稱匹配的人員的ID。我怎樣才能得到每個姓名至少與集合中的一個姓名相匹配的人的ID?

回答

2

有一個更簡單的寫這個查詢方式:

neo4j-sh (?)$ match (p:Person) where p.name in ['ryan', 'mike'] return id(p); 
+-------+ 
| id(p) | 
+-------+ 
| 14680 | 
| 14681 | 
+-------+ 
2 rows 
96 ms 

(測試一些地方的數據,所以你的ID將有所不同)。好的,這就是如何做到這一點。但是,這是事情 - 你可能不應該看,處理或關心單個節點的ID。 See this related question。節點ID應該被認爲是一個實現細節。他們會爲你提供的唯一標識符,但你應該對他們的價值做出零假設。不要假設他們永遠不會改變,或者他們總是以某種方式訂購。如果你需要一個具有實際意義的標識符,請使用你自己的。

+0

有趣的閱讀,但是我得到的ID使用Neo4JTemplate類建立關係。該類中的創建關係方法調用節點ID。 – 2014-10-02 13:38:53

+1

不熟悉該課程或您想要在那裏做什麼。我所能建議的是,如果有一種替代方法處理「Node」對象而不是ID,那可能會更好,這樣您可以讓其他人擔心ID的詳細信息。我儘量不要惹他們,因爲10次中有9次他們不是你想要的。你可能有一個例外,雖然因爲你如何使用它們,我不確定。 – FrobberOfBits 2014-10-02 13:49:59

+1

這些是節點的id,你可以使用'template.query()'方法,這個查詢用一個命名參數替換集合並返回p,那麼你有你的節點'template.query(「match(p :Person)在{names}中的p.name返回p「,map(」names「,asList(」ryan「,」mike「)))。(Node.class);' – 2014-10-02 21:18:41

相關問題