2

这是使用 neo4j 创建内存数据库的正确方法吗?这样遍历查询将只命中缓存而不是磁盘。

方法 - 1:我试过这个:

package com.test;

import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.kernel.impl.util.FileUtils;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class CreateDBFactory {

    private static GraphDatabaseService graphDb = null;
    public static final String DB = "test/db";

    public static GraphDatabaseService createInMemoryDB() {
        System.out.println("- Inside createInMemoryDB() - ");
        if (null == graphDb) {
            synchronized (GraphDatabaseService.class) {
                if (null == graphDb) {
                    System.out.println(" - Inside if clause -");
                    final Map<String, String> config = new HashMap<>();
                    config.put("neostore.nodestore.db.mapped_memory", "50M");
                    config.put("string_block_size", "60");
                    config.put("array_block_size", "300");
                    graphDb = new GraphDatabaseFactory()
                        .newEmbeddedDatabaseBuilder(DB).setConfig(config)
                        .newGraphDatabase();

                    registerShutdownHook(graphDb);
                }
            }
        }
        return graphDb;
    }

    private static void registerShutdownHook(final GraphDatabaseService graphDb) {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                graphDb.shutdown();
            }
        });
    }

    public static void clearDb() {
        try {
            if (graphDb != null) {
                graphDb.shutdown();
                graphDb = null;
            }
            FileUtils.deleteRecursively(new File(DB));
            } catch (final IOException e) {
            throw new RuntimeException(e);
        }
    }

}

方法-2 :使用 Neo4jBasicDocTest 类。

这里new ImpermanentDatabaseBuilder()不是创建 target/test-data/impermanent-db 文件夹。因此无法测试是否创建了“Nancy”节点。

4

1 回答 1

5

Neo4j 没有“内存中”模式,因为所有数据始终存储在内存中并且不使用磁盘存储。ImpermanentGraphDatabase是你能找到的最接近类似的东西,但这只是随机创建一个数据目录,并在它关闭时将其删除。

如果你对使用磁盘没问题,你可以使用上面的ImpermanentGraphDatabase,只需将neo4j的缓存设置为非常高。这将使所有内容都存储在内存和磁盘中。

于 2013-10-18T04:24:14.150 回答