2012-01-31 8 views
0

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の違いは何ですか?

答えて

0

さてさて、私は問題が見つかりました:私は「言葉」現在の文のセットに、私は常にそれらを追加した単語を持続し、私は、Wordの文章プロパティを設定し

。私はそれがいくつかの言葉が何度も持続された理由だと思う。

1

トビアス、

は、あなたが最初のパラメータとしてインデックス名をとり findByPropertyValueかどうかを確認し、役立つだろうあなたの「Word_wordString」インデックスに渡すことができます(これは、APIや良好な関係のガイドではありません)。あなたのリポジトリはNamedIndexRepository`を拡張する必要があります。リポジトリはカスタムインデックス名を自動的に考慮に入れます。

また、別のインデックス名を残しておいてください。デフォルトでは、単純なクラス名(別名Word)が自動的に使用されます。

使用している単語の種類は、英数字またはその他の文字、空白、改行などですか?

+0

私はWordRepositoryをGraphRepositoryとNamedIndexRepositoryに拡張し、既存の単語をチェックするために 'wordRepository.findByPropertyValue(" Word_wordString "、" wordString "、word.getWordString());を使用しました。 コードは私がインデックスをチェックする行を除いて私の元の質問と同じです。何が起こるかは、単語が永続化される最初のときに、インデックスは期待どおりにnullを返し、新しい単語は永続化されます。 2回目に、インデックスはオブジェクトインスタンスを期待どおりに返します。しかし、3回目は、私の元の質問と同じ例外がスローされます。 – Tobias

+0

したがって、persistメソッドは常に新しいノードやエントリをインデックスに作成します。単語に含まれる文字を確認しますが、テスト目的のために、最初に設定したときにすべてをトリミングします。 – Tobias

関連する問題