`for`里面`for`循环内的语句不会同时运行

时间:2015-02-09 20:24:34

标签: clojure neo4j

我尝试使用clojure和neocons库将数据从StackOverflow导入Neo4j。请原谅我是一个新手。

这是我在Leiningen的主要职能:

(defn -main
  [& args]

  (let [neo4j-conn  (nr/connect "http://localhost:7777/db/data/")]

    (cypher/tquery neo4j-conn "MATCH n OPTIONAL MATCH n-[r]-() DELETE n, r")

    (for [page (range 1 6)]
      (let [data (parse-string (stackoverflow-get-questions page))
            questions (data "items")
            has-more (data "has_more")
            question-ids (map #(%1 "question_id") questions)
            answers ((parse-string (stackoverflow-get-answers question-ids)) "items")]
        (map #(import-question %1 neo4j-conn) questions)
        (map #(import-answer %1 neo4j-conn) answers)
      )
    )
  )
)

我已经定义了import-questionimport-answer个功能,这些功能可以独立完成。事实上,奇怪的是,我可以删除其中一条import-*行,另一条可以正常工作。

有人可以看看我做的事情是否错误吗?

1 个答案:

答案 0 :(得分:5)

mapfor都是懒惰的,除非你消耗他们的结果,否则什么都不做。

第一个map调用最终成为一个noop,因为没有办法消耗它的输出。如果您打算使用结果,请尝试将for和至少第一个地图调用打包到dorundoall

此外,您可以将for替换为doseq,除了返回nil之外,它是相同的,会急切地消耗其输入,并且可以在其正文中包含多个表单。

以下是使用doseq代码的代码:

(defn -main
  [& args]
  (let [neo4j-conn (nr/connect "http://localhost:7777/db/data/")]
    (cypher/tquery neo4j-conn "MATCH n OPTIONAL MATCH n-[r]-() DELETE n, r")
    (doseq [page (range 1 6)
            :let [data (parse-string (stackoverflow-get-questions page))
                  questions (data "items")
                  has-more (data "has_more")
                  question-ids (map #(%1 "question_id") questions)
                  answers ((parse-string (stackoverflow-get-answers question-ids)) "items")]]
      (doseq [q questions]
        (import-question q neo4j-conn))
      (doseq [a answers]
        (import-answer a neo4j-conn)))))