2012-01-31 4 views
0

У меня возникают проблемы с индексированием/сохранением с помощью SDN 2.0.0.RELEASE и Neo4j 1.5.persist() всегда создает новый узел

У меня есть класс домен «Word», который в основном выглядит следующим образом:

@NodeEntity 
public class Word { 

@GraphId 
Long graphId; 

@Indexed(indexType = IndexType.SIMPLE, indexName = "Word_wordString") 
private String wordString; 

@RelatedTo(direction = Direction.INCOMING, elementClass = Sentence.class, type = "HAS") 
private Set<Sentence> sentences; 

public Word() { 
} 

public Word(String wordString) { 
    setWordString(wordString); 
} 
} 

Я сохраняющиеся слова с помощью этого метода:

private void persistWord(Sentence sentence, Word word) { 
System.out.println("checking index for wordString: " 
       + word.getWordString()); 
Word existingWord = wordRepository.findByPropertyValue(
       "wordString", word.getWordString()); 
if (existingWord != null) { 
    existingWord.addSentence(sentence); 
    existingWord.persist(); 
    System.out.println("persisted already existing word " 
        + existingWord); 
} else { 
    word.persist(); 
    System.out.println("persisted word " + word); 
} 

Он должен проверить, если слово уже в график, если это так, я изменяю некоторые атрибуты объекта, возвращаемого wordRepository, а затем сохраняю изменения (-> if (existingWord! = null)). Если слово еще не на графике, оно просто сохраняется (-> else).

Это, однако, всегда создает новый узел для каждого слова, даже если он существует на графике. Так сказать, persist() всегда создает новый узел. После есть два слова с тем же wordString в графе, метод вместилище бросает:

More than one element in [email protected] First element is 'Node[45]' and the second element is 'Node[83]' 

Что происходит?

Мне также интересно, какая разница между IndexType.SIMPLE, IndexType.POINT и IndexType.FULLTEXT. (Это не в API или хорошее руководство по связям)

ответ

0

Хорошо, я нашел проблему:

Когда я упорствовал слова, которые я всегда добавили их в «слова» Набор текущего предложения и я поставил приговор свойство Слова. Я думаю, именно поэтому некоторые слова повторялись несколько раз.

1

Tobias,

могли бы вы проверить, если findByPropertyValue, который принимает имя индекса в качестве первого параметра и передать в индекс «Word_wordString» поможет. Ваш репозиторий должен расшириться и затем NamedIndexRepository`. В любом случае репозиторий должен автоматически учитывать ваше имя для пользовательского индекса.

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

Какие слова вы используете, они просто буквенно-цифровые символы или другие символы, такие как пробелы, линии и т. Д.?

+0

Я сделал мой WordRepository расширением GraphRepository и NamedIndexRepository и использовал 'wordRepository.findByPropertyValue (« Word_wordString »,« wordString », word.getWordString());' для проверки существующих слов. Код такой же, как в моем исходном вопросе, за исключением строки, где я проверяю индекс. Случается, что в первый раз, когда нужно сохранить слово, индекс возвращает нуль, как и ожидалось, новое слово сохраняется. Во второй раз индекс возвращает экземпляр объекта, как и ожидалось. Однако в третий раз индекс генерирует то же исключение, что и в моем первоначальном вопросе. – Tobias

+0

Поэтому я считаю, что метод persist всегда создает новый узел и/или запись в индексе! Я проверю, какие символы содержат слова, но для целей тестирования я обрезаю их все, когда они изначально установлены. – Tobias

Смежные вопросы