我正在尝试在我现有的neo4j图形数据库上运行JUNGs PageRank算法,并将节点的分数保存为将来参考的属性。
所以我创建了以下groovy文件:import edu.uci.ics.jung.algorithms.scoring.PageRank
g = new Neo4jGraph('/path/to/graph.db')
j = new GraphJung(g)
pr = new PageRank<Vertex,Edge>(j, 0.15d)
pr.evaluate()
g.V.sideEffect{it.pagerank=pr.getVertexScore(it)}
并在gremlin中运行。
它运行平稳,如果我通过g.v(2381).map()
检查属性,我得到了我所期望的。
但是,当我离开gremlin并启动我的neo4j服务器时,这些修改是不存在的。
谁能解释为什么和如何解决这个问题?
我的直觉是,这与我在gremlin中嵌入的图形有关:
gremlin> g
==>neo4jgraph[EmbeddedGraphDatabase [/path/to/graph.db]]
任何想法?
在groovy脚本的末尾需要一个g.shutdown()
。如果没有g.shutdown()
,对图的所有更改都很可能留在内存中。从磁盘(在您的示例中是/path/to/graph.db
)重新初始化图,将丢失仍然在内存中的更改。g.shutdown()
将把当前事务从内存刷新到磁盘。这将确保您的更改持续存在,并在您尝试再次访问数据库时检索。
希望对你有帮助。
注:您对嵌入式数据库的预感是正确的。如果使用Neo4j的REST接口,这个问题将不会发生,因为每个REST API请求都被视为单个事务。