2013-06-18 2 views
2

Я работаю над проектом с базой данных 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, которое у меня будет в реальной ситуации).

Пожалуйста, можете ли вы дать мне какой-то намек или что-нибудь еще, что могло бы помочь мне в этом вопросе? Спасибо заранее.

+1

Это очень странно. Насколько велика трафик, фактически проходящий через конечные точки HTTP? –

ответ

3

Это действительно страх, где работает ваш сервер? Кажется, что-то с настройкой сети.

Я имею в виду SDN over REST не быстро, но это также не так медленно.

Вы также можете поделиться своими занятиями?

Вам не следует делать индивидуальные обновления свойств по кабелю. Используйте операторы cypher, которые создают все свойства за один раз.

Существует также neo4jTemplate.createNode (карта свойств), которая делает это как одна операция.

+1

Да, действительно странно. Мой сервер работает на локальном хосте, поэтому есть небольшая задержка между сервером приложений и сервером neo4j, но я уверен, что буду отслеживать сетевое общение через Wireshark. Благодарим за примечание об индивидуальной собственности. Измените его, и теперь он немного быстрее. ;) Также я читаю здесь: http://www.rene-pickhardt.de/get-the-full-neo4j-power-by-using-the-core-java-api-for-traversing-your-graph- data-base-вместо-cypher-query-language /, что основной API быстрее, чем Cypher, поэтому я решил пойти с ядром API Кроме того, я изменил режим графика на Embedded, и теперь он очень быстрый. – Toni