我尝试使用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-question
和import-answer
个功能,这些功能可以独立完成。事实上,奇怪的是,我可以删除其中一条import-*
行,另一条可以正常工作。
有人可以看看我做的事情是否错误吗?
答案 0 :(得分:5)
map
和for
都是懒惰的,除非你消耗他们的结果,否则什么都不做。
第一个map
调用最终成为一个noop,因为没有办法消耗它的输出。如果您打算使用结果,请尝试将for
和至少第一个地图调用打包到dorun
或doall
。
此外,您可以将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)))))