2015-02-09 88 views
0

我试图使用clojure和neocons库将数据从StackOverflow导入到Neo4j。请原谅我是一个新手。'let`里面的语句for`循环不会同时运行

下面是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-*行,另一个将工作得很好。

任何人都可以看到我是否做了简单的事情是错的吗?

+3

您的具体问题没有重复,但答案肯定是。 'map'和'for'都是懒惰的,除非你使用它们的结果,否则它什么都不会做。第一个'map'调用最终是一个noop,因为没有办法消耗它的输出。尝试将'for'和至少第一个'map'调用包装到'dorun'的调用中。 – noisesmith 2015-02-09 20:27:21

+0

啊,太好了,当然就是这样。谢谢! – 2015-02-09 20:35:48

+0

懒虫会不时地咬我们所有人(或者至少是我)。 PS:@noisesmith足够长的时间来回答问题。重复回答关于SO的不同问题没有任何问题。如果有可接受的答案,它将帮助那些在搜索结果中漫步的人。 – 2015-02-09 21:57:18

回答

5

mapfor都是懒惰的,除非您使用它们的结果,否则它什么都不会做。

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

此外,您可以用替换for,除了它返回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))))) 
+0

太棒了,谢谢!绝对好,即使它是重复的。我搜索了很多,并且找不到任何答案,所以我们正在为这个问题增加用户的登陆空间,我想 – 2015-02-10 07:05:01