Neo4j медленный шифровальный запрос во встроенном режиме

У меня есть огромная база данных графов с авторами, которые связаны с бумагами и бумагами, связанными с узлами, которые содержат метаинформацию о бумаге. Я попытался выбрать авторов, которые соответствуют определенному шаблону, и поэтому я выполнил следующий оператор шифрования в Java.

String query = "MATCH (n:AUTHOR) WHERE n.name =~ '(?i).*jim.*' RETURN n";
db.execute(query);

Я получаю результат Установить со всеми "авторами" обратно. Но исполнение очень медленное. Это потому, что Neo4j записывает результат в память?

Если я пытаюсь найти узлы с помощью Java API, это происходит намного быстрее. Конечно, я могу искать только точное имя, как в следующем примере кода, но это примерно на 4 секунды быстрее, чем в запросе выше. Я проверил его на небольшой базе данных с примерно 50 узлами, причем только 6 узлов являются авторами. Шесть авторов также в индексе.

db.findNodes(NodeLabel.AUTHOR, NodeProperties.NAME, "jim knopf" );

Есть ли шанс ускорить шифр? Или возможность получить все узлы через Java API и findNodes() метод, который соответствует данной модели?

Просто для информации, я создал индекс имени автора в Java с graph.schema().indexFor(NodeLabel.AUTHOR).on("name").create();

Возможно, кто-то может помочь. Заранее спасибо.

РЕДАКТИРОВАТЬ:

Я провел несколько тестов сегодня. Если я выполню запрос PROFILE MATCH (n:AUTHOR) WHERE n.name = 'jim seroka' RETURN n; в интерфейсе браузера у меня есть только оператор NodeByLabelScan. Мне кажется, что Neo4j не использует индекс автоматически (индекс для имени онлайн). Если я использую определенный индекс, и выполнить запрос PROFILE MATCH (n:AUTHOR) USING INDEX n:AUTHOR(name) WHERE n.name = 'jim seroka' RETURN n; индекс будет использоваться. Обычно Neo4j должен автоматически использовать правильный индекс. Есть ли какая-либо конфигурация для установки?

Я также снова провел тестирование во встроенном режиме, чтобы проверить производительность запроса во встроенном режиме. Я пытался выбрать автора "Джим Серока" с db.findNode(NodeLabel.AUTHOR, "name", "jim seroka");, Это работает, и мне кажется, что индекс используется из-за времени выполнения ~0,05 секунд.

Но если я выполняю тот же запрос, который я выполнял в интерфейсе и упоминал ранее, используя определенный индекс, это занимает ~4,9 секунды. Зачем? Я немного беспомощен. База данных является локальной, и в ней всего 6 авторов. Медленный разъем или создание соединения не так? в порядке, findNode() возвращает только узел и выполняет весь результат, но с разницей в четыре секунды?

Следующий исходный код должен показать, как будет создана база данных и выполнен запрос.

public static GraphDatabaseService getNeo4jDB() {
    ....
    return new GraphDatabaseFactory().newEmbeddedDatabase(STORE_DIR);
}

private Result findAuthorNode(String searchValue) {
    db = getNeo4jDB();

    String query = "MATCH (n:AUTHOR) USING INDEX n:AUTHOR(name) WHERE n.name = 'jim seroka' RETURN n";

    return db.execute(query);
}

1 ответ

Ваш запрос использует регулярное выражение и поэтому не может использовать индекс:

MATCH (n:AUTHOR) WHERE n.name =~ '(?i).*jim.*' RETURN n

Neo4j 2.3 представил поддерживаемый индекс STARTS WITH оператор строки, поэтому этот запрос будет очень производительным:

MATCH (n:Author) WHERE n.name STARTS WITH 'jim' RETURN n

Не совсем так же, как регулярное выражение, но будет иметь лучшую производительность.

Другие вопросы по тегам