2013-12-19 44 views
0

我試圖篩選節點:使用過濾器的邊緣/頂點

user = g.v(42); 

g.idx('comparisons')[[id:Neo4jTokens.QUERY_HEADER + '*']] 
.filter{ 
    if (it.out('COMPARED_VALUE1').in('VOTED').in('VOTES').next().equals(user)) 
    { 
     return true; 
    } 
    return false; 
}.count(); 

我真的不明白管道是如何工作的,但我明白,下一個()打破東西過濾器「循環」。

我應該得到2個結果,但我沒有得到。

Regards,

+0

你想達到什麼目的? –

回答

0

你想達到什麼目的?

對不起,我的gremlin知識接近零這些天。

在暗號它可能看起來像這樣

START user=node(42), comp=node:comparisons("id:*") 
MATCH comp-[:COMPARED_VALUE1]->()<-[:VOTED*2]-(user) 
RETURN count(*) 
1

我可能需要修改我的答案,因爲我可能需要你正在努力實現(如@邁克爾還要求)什麼更多的細節,但如果你認爲你的問題是next(),然後考慮以下幾點:

user = g.v(42); 

g.idx('comparisons')[[id:Neo4jTokens.QUERY_HEADER + '*']] 
.filter{it.out('COMPARED_VALUE1').in('VOTED').in('VOTES').next().equals(user)}.count(); 

首先,注意上面,你的封過濾器可以立即降低到(這將產生同樣的錯誤,當然)。考慮到過濾器關閉,你假設當你使用next()時,用戶頂點將從管道中流出。情況可能並非如此。因此,我會重新寫一個過濾器封口:

user = g.v(42); 

g.idx('comparisons')[[id:Neo4jTokens.QUERY_HEADER + '*']].filter{ 
    def p = it.out('COMPARED_VALUE1').in('VOTED').in('VOTES') 
    p.hasNext() ? p.next().equals(user) : false 
}.count(); 

這應該會解決你的問題就在那裏因爲你只需要在管道p評估的第一項假設這是你有效地什麼在做之前。我想知道,如果你不能簡單地使用except/retain pattern這裏得到答案,因爲它是少了幾分令人費解:

user = g.v(42); 

g.idx('comparisons')[[id:Neo4jTokens.QUERY_HEADER + '*']] 
    .out('COMPARED_VALUE1').in('VOTED').in('VOTES').retain([user]) 
    .count(); 

希望的東西在這裏把你在正確的軌道,以你的答案上。

相關問題