SDN 2.0.0.RELEASEとNeo4j 1.5のインデックス作成/永続化に問題があります。persist()は常に新しいノードを作成します
私は基本的に次のようになり、ドメインクラス「言葉」を持っている:私はこの方法で単語を持続しています
@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を持つ2つの単語があります後、リポジトリメソッドはスロー:
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の違いは何ですか?
私はWordRepositoryをGraphRepositoryとNamedIndexRepositoryに拡張し、既存の単語をチェックするために 'wordRepository.findByPropertyValue(" Word_wordString "、" wordString "、word.getWordString());を使用しました。 コードは私がインデックスをチェックする行を除いて私の元の質問と同じです。何が起こるかは、単語が永続化される最初のときに、インデックスは期待どおりにnullを返し、新しい単語は永続化されます。 2回目に、インデックスはオブジェクトインスタンスを期待どおりに返します。しかし、3回目は、私の元の質問と同じ例外がスローされます。 – Tobias
したがって、persistメソッドは常に新しいノードやエントリをインデックスに作成します。単語に含まれる文字を確認しますが、テスト目的のために、最初に設定したときにすべてをトリミングします。 – Tobias