У меня возникают проблемы с индексированием/сохранением с помощью 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 или хорошее руководство по связям)
Я сделал мой WordRepository расширением GraphRepository и NamedIndexRepository и использовал 'wordRepository.findByPropertyValue (« Word_wordString »,« wordString », word.getWordString());' для проверки существующих слов. Код такой же, как в моем исходном вопросе, за исключением строки, где я проверяю индекс. Случается, что в первый раз, когда нужно сохранить слово, индекс возвращает нуль, как и ожидалось, новое слово сохраняется. Во второй раз индекс возвращает экземпляр объекта, как и ожидалось. Однако в третий раз индекс генерирует то же исключение, что и в моем первоначальном вопросе. – Tobias
Поэтому я считаю, что метод persist всегда создает новый узел и/или запись в индексе! Я проверю, какие символы содержат слова, но для целей тестирования я обрезаю их все, когда они изначально установлены. – Tobias