我正在尝试使用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)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
我已经定义import-question和import-answer功能,这些工作独立.事实上,奇怪的是我可以删除其中任何一条import-*线,而另一条线条可以正常工作.
任何人都可以看到我做的事情是不是很简单?
这两个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)))))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |