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
Не совсем так же, как регулярное выражение, но будет иметь лучшую производительность.