批量Neo4J更新速度

时间:2015-07-13 15:36:06

标签: neo4j neo4jclient

我的目标是在牛津词典中有一个单词列表,它们之间的关系称为IS_ONE_STEP_AWAY_FROM。关系中的每个单词长度相同,只有一个字母。

我目前能够批量插入单词本身,但是如何批量插入这些关系呢?

    class Word
    {
        public string Value { get; set; }
    }

    public void SeedDatabase()
    {
        var words = new Queue<Word>();
        EnqueueWords(words);

        //Create the words as a batch
        GraphClient.Cypher
            .Create("(w:Word {words})")
            .WithParam("words", words)
            .ExecuteWithoutResults();

        //Add relationships one word at a time
        while (words.Count > 0)
        {
            var word = words.Dequeue();
            var relatedWords = WordGroups[word.Value].Except(Enumerable.Repeat(word.Value, 1)).ToList();
            if (relatedWords.Count > 0)
            {
                foreach (string relatedWord in relatedWords)
                {
                    GraphClient.Cypher
                        .Match("(w1 :Word { Value : {rootWord} }), (w2 :Word { Value : {relatedWord} })")
                        .Create("(w1)-[r:IS_ONE_STEP_AWAY_FROM]->(w2)")
                        .WithParam("rootWord", word.Value)
                        .WithParam("relatedWord", relatedWord)
                        .ExecuteWithoutResults();
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

彼得在:Word(Value)上有索引或约束吗?

我也不完全了解这批次的方式:

    GraphClient.Cypher
        .Create("(w:Word {words})")
        .WithParam("words", words)
        .ExecuteWithoutResults();

您定义属性名称(又名Value)。

你目前同时运行吗?

对于我建议的关系,我们建议用start-word对它们进行分组。

然后你可以做类似的事情:

MATCH (w1:Word {Value:{rootWord}})
UNWIND {relatedWords} as relatedWord
MATCH (w2:Word {Value:relatedWord}}
CREATE (w1)-[r:IS_ONE_STEP_AWAY_FROM]->(w2);

Neo4jClient还必须学会使用新的事务端点。