Я работаю над проектом с базой данных Spring и Neo4j. Я настроил свою базу данных Neo4j на отдых neo4j. Это конфигурация:Использование Neo4jTemplate для сохранения данных в конфигурации останова слишком медленно
<neo4j:config graphDatabaseService="graphDatabaseService" />
<bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
<constructor-arg index="0" value="http://localhost:7474/db/data" />
</bean>
В начале я использовал пометки на мои объектах предметной области (@NodeEntity
, @RelatedTo
и т.д.) и хранилища для сохранения узлов и связей. Мои объекты домена: Пользователь (id, name), Продукт (id, название, описание, список условий), Термин (содержание, количество). Так что там не так много свойств, но тем не менее, сохранение объекта через репозиторий, например, Пользователь с определенным идентификатором и именем для 25 секунд.
Я читал, что этот вид связи с базой данных neo4j еще не оптимизирован, поэтому я включил с помощью Neo4jTemplate.
Это пример сохранения пользователя (ограничения в пользователя являются строки («ID», «имя», «USER»):
public Node saveUser(User user) {
Node node = template.createNode();
node.setProperty(User.ID, user.getId());
node.setProperty(User.NAME, user.getName());
node.setProperty("_type", User.LABEL);
template.index(INDEX_ID, node, User.ID, user.getId());
return node;
}
И это пример сохранения элемента с отношениями . с его условиями Таким образом, каждый член является узлом, который соединен с элементом:
public Node saveItem(Item item) {
Node node = template.createNode();
node.setProperty(Item.ID, item.getId());
node.setProperty(Item.NAME, item.getName());
node.setProperty(Item.DESCRIPTION, item.getDescription());
node.setProperty("_type", Item.LABEL);
template.index(INDEX_ID, node, Item.ID, item.getId());
for(String termContent : item.getTerms()) {
Node term = termRepository.getNodeByContent(termContent);
if(term == null) {
term = termRepository.saveTerm(new Term(termContent));
} else {
termRepository.addCountToTerm(term);
}
int frequency = 1;
Relationship contains = node.createRelationshipTo(term, RelationshipTypes.CONTAINS);
contains.setProperty(Term.FREQUENCY, frequency);
}
return node;
}
объект termRepository
(не расширение GraphRespository<Term>
) имеет методы, которые аналогичны способу сохранения пользователя Извлечение. срок делается следующим образом:
public Node getNodeByContent(String content) {
if(!template.getGraphDatabaseService().index().existsForNodes(INDEX_ID))
return null;
return template.lookup(INDEX_ID, Term.CONTENT, content).to(Node.class).singleOrNull();
}
И, наконец-то, в чем моя проблема. Даже сейчас это все еще медленно, вставляя пользователя (только параметры id и имя) и индексируя его для 3 секунды и вставляя элемент, где он подключен к условиям, принимает в течение 30 секунд (на 4 срока - на очень маленькое количество в зависимости от количества 60-70, которое у меня будет в реальной ситуации).
Пожалуйста, можете ли вы дать мне какой-то намек или что-нибудь еще, что могло бы помочь мне в этом вопросе? Спасибо заранее.
Это очень странно. Насколько велика трафик, фактически проходящий через конечные точки HTTP? –