2015-11-05 94 views
1

我不知道在neo4j中迭代列表。請有人建議下面的問題的想法。Neo4j - 迭代給定節點列表的公共節點

例如: 我在圖中有一些節點。 然後,我會給出幾個(總是變化的,這是用戶輸入的)關鍵字來搜索這個詞常見的節點。在我的圖中,每個單詞都是一個節點。

Ex: Input: [Best sports car] 
output: connected nodes for Best are [samsung,porshe,ambassdor,protein,puma] 
     connected nodes for sports are [cricket,racing,rugby,puma,porshe] 
     connected nodes for car are [porshe,ambassdor,benz,audi] 
Common nodes to all words are : [porshe] 
Result is : porshe 

我對迭代每個單詞和存儲匹配結果沒有任何想法。請有人建議任何想法。

回答

3

爲了測試以下工作查詢,我會作出一些假設:

  • 的話節點具有標籤:Wordname財產。
  • 保時捷,美洲獅等,節點有標籤:Itemname property
  • Item節點具有傳出CONNECT關係來Word節點

這將給下圖:

enter image description here

該查詢是以下(以模擬給定的字作爲參數,我在查詢的開頭添加了包含單詞列表的WITH)

WITH ["car","best","sports"] as words 
MATCH (n:Word)<-[:CONNECT]-(i:Item) 
WHERE n.name IN words 
WITH i, count(*) as c, words 
WHERE c = size(words) 
RETURN i 

並將僅返回porsche Item節點。

邏輯解釋

查詢的邏輯,是如果節點的匹配所有給出話,就會有3種模式,以它在第一MATCH發現,所以count(*)將有此處爲porsche節點的值爲3。 將此值與words列表的size進行比較。

更多的解釋

WITH說法,有兩個表達式:icount(*)

i不是聚合函數,所以它將作爲分組鍵。 count(*)是一個聚合函數,將在i存儲桶上運行,計算總值。

例如,如果你想知道有多少字,每個Item是匹配,你可以簡單地做:

WITH ["car","best","sports"] as words 
MATCH (n:Word)<-[:CONNECT]-(i:Item) WHERE n.name IN words 
RETURN i.name, count(*) 

將返回此:

enter image description here

你可以看到,porsche匹配3個單詞,這是給定words列表的size,那麼您可以簡單地比較的到這個size

爲了充分了解如何聚集的作品,你可以參考手冊:http://neo4j.com/docs/stable/query-aggregation.html

您可以測試在這裏查詢:如果你通過的話作爲參數

http://console.neo4j.org/r/e6bee0

,這將會是相應的查詢:

MATCH (n:Word)<-[:CONNECT]-(i:Item) 
WHERE n.name IN {words} 
WITH i, count(*) as c 
WHERE c = size({words}) 
RETURN i 

假設{words}是給的名字n查詢參數

+0

這有點難理解。你能否詳細說明查詢。 –

+0

有竅門。很有幫助。謝謝。 –

+0

我添加了更多信息 –

1

就是這樣的,你在追求什麼?

從形成請求的搜索的單詞集合開始。

將每個單詞與圖匹配。

收集列表中的連接詞彙。

with ['Best', 'sports', 'car'] as word_coll 
unwind word_coll as word 
match (:Word {name: word})--(conn_word:Word) 
return word,collect(conn_word)