0

我在使用 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 (existingWord != null))。如果该单词不在图中但它只是持久化(-> else)。

然而,这总是为每个单词创建一个新节点,即使它存在于图中。可以这么说,persist() 总是创建一个新节点。在图中出现两个具有相同 wordString 的单词后,repository 方法会抛出:

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 或良好关系指南中)

4

2 回答 2

1

托比亚斯,

您能否检查findByPropertyValue将索引名称作为第一个参数并传入您的“Word_wordString”索引是否会有所帮助。您的存储库也必须扩展 NamedIndexRepository`。无论如何,存储库都应该自动考虑您的自定义索引名称。

您也可以尝试省略单独的索引名称,然后它将默认为简单的类名称,也就是Word自动使用的名称。

您使用的是什么类型的单词,它们只是字母数字字符还是其他字符,比如空格、换行符等?

于 2012-02-04T23:16:41.573 回答
0

好吧,我发现了问题:

当我坚持单词时,我总是将它们添加到当前句子的“单词”集中,并设置 Word 的句子属性。我认为这就是为什么有些词被多次坚持的原因。

于 2012-02-20T00:06:26.503 回答