2013-10-21 53 views
0
(defn cypher 
    [query] 
    (let [result (-> *cypher* (.execute query))] 
    (for [row result 
      column (.entrySet row)] 
     {(keyword (.getKey column)) 
     (Neo4jVertex. (.getValue column) *g*)}))) 

repl=> (cypher "start n=node:people('*:*') return n") 
{:n #<Neo4jVertex v[1]>} 

此查詢返回兩個結果,但我只能看到一個使用clojure.core/for。我應該怎麼做呢?clojure.core/for Cypher ExecutionResult

的Neo4j的文檔有這個例子(這是我想要效仿):

for (Map<String, Object> row : result) 
{ 
    for (Entry<String, Object> column : row.entrySet()) 
    { 
     rows += column.getKey() + ": " + column.getValue() + "; "; 
    } 
    rows += "\n"; 
} 

回答

0

我想你需要clojure.core/doseqdocs)來代替。

user=> (doseq [row [1 2 3]] 
    #_=>  [result [4 5 6]] 
    #_=> (println (str {:row row :result result})))) 
{:row 1, :result 4} 
{:row 1, :result 5} 
{:row 1, :result 6} 
{:row 2, :result 4} 
{:row 2, :result 5} 
{:row 2, :result 6} 
{:row 3, :result 4} 
{:row 3, :result 5} 
{:row 3, :result 6} 

因此,適應你的榜樣,像下面可能的工作:

; ... 
(doseq [row result] 
     [column (.entrySet row)] 
    (println (str {(keyword (.getKey column)) (Neo4jVertex. (.getValue column) *g*)})))) 
; ... 

注意doseq回報nil;您必須在doseq表單的正文中調用類似println的副作用。

它看起來像clojure.core/for確實列表理解,所以像下面居然返回一個列表:

user=> (for [row [1 2 3] 
    #_=>  result [4 5 6]] 
    #_=> {:row row :result result}) 
({:row 1, :result 4} {:row 1, :result 5} {:row 1, :result 6} {:row 2, :result 4} {:row 2, :result 5} {:row 2, :result 6} {:row 3, :result 4} {:row 3, :result 5} {:row 3, :result 6}) 
+0

謝謝。 'for'與'doseq'的功能相同,只是它返回一個序列,這是我在這種情況下所需要的,而不是零。 'doseq'更像副作用,如反覆調用.put – tjb1982

+0

'(into []( - > * cypher *(.execute query)))'在我的示例中修復了它,但我不確定爲什麼,因爲顯然這是可迭代的,沒有'(到[] ...)' – tjb1982

+0

啊,我明白了,我一定誤解了你的實際問題。我也在努力自己學習Clojure,最近我對某種程度上的'for'和'doseq'感到非常困惑。 –