clojure.core /用于Cypher ExecutionResult

时间:2013-10-21 16:36:41

标签: clojure

(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的结果。我该怎么办呢?

Neo4j文档有这个例子(这是我试图模仿的):

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

1 个答案:

答案 0 :(得分: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;您必须在println表单的正文中调用带有doseq等副作用的内容。

看起来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})