2012-01-31 76 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在圖中,庫方法拋出:

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

托比亞斯,

你可以檢查是否接受一個索引名作爲第一個參數findByPropertyValue,並通過在你的「Word_wordString」指標會有所幫助。你的倉庫也必須擴展NamedIndexRepository`。無論如何,存儲庫應該自動考慮您的自定義索引名稱。

您也可以嘗試不使用單獨的索引名稱,那麼它將默認爲簡單的類名稱,即Word,這將自動使用。

你使用的是什麼類型的單詞是字母數字字符或其他字符,如空格,換行符等?

+0

我已經讓我的WordRepository擴展了GraphRepository和NamedIndexRepository並使用了'wordRepository.findByPropertyValue(「Word_wordString」,「wordString」,word.getWordString());'來檢查現有的單詞。 代碼與我原來的問題相同,除了檢查索引的行外。會發生什麼是,一個單詞首次被持續存在時,索引將如預期返回null,新單詞將被保留。第二次,索引按預期返回一個對象實例。然而,第三次索引拋出了與我原來的問題相同的例外。 – Tobias 2012-02-07 22:08:38

+0

因此,我認爲,堅持方法總是在索引中創建一個新節點和或條目!我會檢查這些單詞包含哪些字符,但爲了測試目的,我們在初始設置時將它們全部修剪。 – Tobias 2012-02-07 22:12:49