neo4j огромный граф и решение - PullRequest
3 голосов
/ 17 октября 2011

У меня довольно большая сеть в файле CSV.Он содержит 450 тыс. Узлов и 45 000 000 взаимосвязей.Как я прочитал в документации по neo4j, этот тип базы данных может работать с такой большой сетью.

Я также читал, что могу использовать встроенный сервер, а также один.

Мойвопрос в чем разница между ними?Я хотел бы иметь сервер, который хранит состояние своей базы данных.

Второй вопрос: я могу использовать REST API для выполнения операций над базой данных, Java API для этого.

Что такоеразница в производительности?Я хотел бы, например, иметь на выходе все уровни узлов.

Можно ли загрузить график из CSV?

Как лучше всего решить мою проблему?

Ответы [ 3 ]

5 голосов
/ 18 ноября 2011

Вот код, который вы использовали бы с Neo4j-Batch-Inserter для импорта записей вызовов, вместо того, чтобы генерировать данные на лету, вы, конечно, прочитали бы их из файла и соответствующим образом разбили каждую запись.

import org.apache.commons.io.FileUtils;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.index.BatchInserterIndex;
import org.neo4j.helpers.collection.MapUtil;
import org.neo4j.index.impl.lucene.LuceneBatchInserterIndexProvider;
import org.neo4j.kernel.impl.batchinsert.BatchInserterImpl;

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

import static org.neo4j.helpers.collection.MapUtil.map;

public class CallRecordImportBatch {

    public static final int MILLION = 1000000;
    public static final int BATCH_SIZE = MILLION;
    public static final int CALLS = 45 * MILLION;
    public static final int USERS = CALLS / 100;
    public static final File STORE_DIR = new File("target/calls_"+ CALLS);
    private static final Random rnd = new Random();

    enum MyRelationshipTypes implements RelationshipType {CALLED}

    private static String randomPhoneNumber() {
        final int phoneNumber = rnd.nextInt(USERS);
        return String.format("%013d", phoneNumber);
    }

    public static void main(String[] args) throws IOException {
        long time = System.currentTimeMillis();
        CallRecordImportBatch importBatch = new CallRecordImportBatch();
        importBatch.createGraphDatabase();
        System.out.println((System.currentTimeMillis() - time) + " ms: "+ "Create Database");
    }

    private BatchInserterImpl db;
    private BatchInserterIndex phoneNumberIndex;

    private void createGraphDatabase() throws IOException {
        if (STORE_DIR.exists()) FileUtils.cleanDirectory(STORE_DIR);
        STORE_DIR.mkdirs();
        db = new BatchInserterImpl(STORE_DIR.getAbsolutePath(),
                MapUtil.stringMap("cache_type", "weak",
                        "neostore.nodestore.db.mapped_memory", "500M",
                        "neostore.relationshipstore.db.mapped_memory", "2000M",
                        "neostore.propertystore.db.mapped_memory", "1000M",
                        "neostore.propertystore.db.strings.mapped_memory", "0M",
                        "neostore.propertystore.db.arrays.mapped_memory", "0M"
                ));
        final LuceneBatchInserterIndexProvider indexProvider = new LuceneBatchInserterIndexProvider(db);
        phoneNumberIndex = indexProvider.nodeIndex("Caller", MapUtil.stringMap("type", "exact"));
        phoneNumberIndex.setCacheCapacity("Caller", 1000000);

        long time = System.currentTimeMillis();
        Map<String,Long> cache = new HashMap<String,Long>(USERS);
        try {
            for (int call=0;call< CALLS;call++) {
                if (call % BATCH_SIZE == 0) {
                    System.out.println((System.currentTimeMillis() - time) + " ms: "+ String.format("calls %d callers %d", call, cache.size()));
                    time = System.currentTimeMillis();
                }
                final String callerNumber = randomPhoneNumber();
                final int duration = (int) (System.currentTimeMillis() % 3600);
                final String calleeNumber = randomPhoneNumber();

                long caller = getOrCreateCaller(cache, callerNumber);
                long callee = getOrCreateCaller(cache, calleeNumber);

                db.createRelationship(caller, callee, MyRelationshipTypes.CALLED, map("duration", duration));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println((System.currentTimeMillis() - time) + " ms: " + String.format("calls %d callers %d", CALLS, cache.size()));
        indexProvider.shutdown();
        db.shutdown();
    }

    private Long getOrCreateCaller(Map<String, Long> cache, String number) {
        final Long callerId = cache.get(number);
        if (callerId!=null) return callerId;
        long caller = createCaller(number);
        cache.put(number, caller);
        return caller;
    }

    private long createCaller(String number) {
        long caller = db.createNode(map("Number", number));
        phoneNumberIndex.add(caller, map("Number", number));
        phoneNumberIndex.flush();
        return caller;
    }
}
2 голосов
/ 02 ноября 2011

Встроенная база данных находится в том же процессе, что и ваше приложение, а это означает, что сетевые издержки отсутствуют (поэтому встроенная система работает намного быстрее). Конечно, оба хранят данные, поэтому у вас есть база данных для начала: -)

Вы даже можете использовать встроенный режим и автономный сервер одновременно, см .: http://docs.neo4j.org/chunked/snapshot/server-embedded.html

Для загрузки большого количества данных за один раз следует использовать BatchInserter, см .: http://docs.neo4j.org/chunked/milestone/indexing-batchinsert.html

1 голос
/ 07 ноября 2011

Для выполнения операций REST существует java-API .

<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-rest-graphdb</artifactId>
    <version>1.5-SNAPSHOT</version>
or last milestone
    <version>1.5.M02.U1</version>
</dependency>

Что вы подразумеваете под:

Я хотел бы, например, иметь на выходе все уровни узлов.

Относительно вашего другоговопросы - как выглядит ваша модель данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...