我在使用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返回的对象的某些属性,然后保留更改( - &gt; if(existingWord!= null))。如果该单词不在图表中,则它只是持久化( - &gt; else)。
然而,这总是为每个单词创建一个新节点,即使它存在于图形中。可以这么说,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或良好关系指南中)
答案 0 :(得分:1)
托拜厄斯,
您可以检查将索引名称作为第一个参数并传入“Word_wordString”索引的findByPropertyValue
是否有帮助。您的存储库也必须扩展NamedIndexRepository`。无论如何,存储库应自动考虑您的自定义索引名称。
您也可以尝试不使用单独的索引名称,然后默认为简单的类名,即Word
,它将自动使用。
你使用的是什么类型的单词,只是字母数字字符或其他字符,如空格,换行符等?
答案 1 :(得分:0)
好吧,我发现了问题:
当我坚持单词时,我总是将它们添加到当前句子的“单词”集合中,并设置单词的句子属性。我认为这就是为什么有些词语被多次坚持的原因。