persist () всегда создает новый узел - PullRequest
0 голосов
/ 31 января 2012

У меня проблемы с индексацией / сохранением в SDN 2.0.0.RELEASE и Neo4j 1.5.

У меня есть класс домена "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 (существующиеWord! = Нуль)). Если этого слова еще нет на графике, оно просто сохраняется (-> еще).

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

More than one element in org.neo4j.index.impl.lucene.LuceneIndex$1@1181df3. First element is 'Node[45]' and the second element is 'Node[83]'

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

Мне также интересно, в чем разница между IndexType.SIMPLE, IndexType.POINT и IndexType.FULLTEXT. (Его нет ни в API, ни в руководстве «Хорошие отношения»)

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

Тобиас,

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

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

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

0 голосов
/ 20 февраля 2012

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

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

...