使用Neo4jTemplate在Rest配置中保存数据太慢了

时间:2013-06-18 01:14:11

标签: neo4j graph-databases spring-data-neo4j

我正在使用Spring和Neo4j数据库进行项目。我将我的Neo4j数据库配置为休息neo4j。这是配置:

<neo4j:config graphDatabaseService="graphDatabaseService" />
<bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
    <constructor-arg index="0" value="http://localhost:7474/db/data" />
</bean>

一开始我在我的域对象(@NodeEntity@RelatedTo等)和存储库上使用符号来保存节点和关系。我的域对象为用户(ID,名称),(ID,名称,说明,术语列表),期限(内容,计数) )。因此没有那么多属性,但即便如此,通过存储库保存对象,例如具有已定义id和名称的用户持续 25秒

我读到这种与neo4j数据库的通信尚未得到很好的优化,因此我使用Neo4jTemplate 打开了。

这是保存用户的示例(User are Strings中的约束(“id”,“name”,“USER”):

public Node saveUser(User user) {
    Node node = template.createNode();
    node.setProperty(User.ID, user.getId());
    node.setProperty(User.NAME, user.getName());
    node.setProperty("_type", User.LABEL);

    template.index(INDEX_ID, node, User.ID, user.getId());
    return node;
}

这是保存项目与其条款的关系的示例。所以每个术语都是一个连接到项目的节点:

public Node saveItem(Item item) {
    Node node = template.createNode();
    node.setProperty(Item.ID, item.getId());
    node.setProperty(Item.NAME, item.getName());
    node.setProperty(Item.DESCRIPTION, item.getDescription());
    node.setProperty("_type", Item.LABEL);

    template.index(INDEX_ID, node, Item.ID, item.getId());

    for(String termContent : item.getTerms()) {
        Node term = termRepository.getNodeByContent(termContent);
        if(term == null) {
            term = termRepository.saveTerm(new Term(termContent));
        } else {
            termRepository.addCountToTerm(term);
        }

        int frequency = 1;          

        Relationship contains = node.createRelationshipTo(term, RelationshipTypes.CONTAINS);
        contains.setProperty(Term.FREQUENCY, frequency);            
    }
    return node;
}

对象termRepository(不扩展GraphRespository<Term>)具有与保存用户的方法类似的方法。获取该术语的方式如下:

public Node getNodeByContent(String content) {
    if(!template.getGraphDatabaseService().index().existsForNodes(INDEX_ID))
        return null;
    return template.lookup(INDEX_ID, Term.CONTENT, content).to(Node.class).singleOrNull();
}

而且,最终我的问题是什么。即使现在它仍然很慢,插入用户(仅参数id和名称)并将其编入索引需要 3秒,并插入项目所连接的项目 30秒(对于4个术语 - 根据实际情况下我将拥有的60-70的数量非常小)。

拜托,你能给我一些暗示或其他任何可以帮助我解决这类问题的事吗? 提前谢谢。

1 个答案:

答案 0 :(得分:3)

这真的很奇怪,你的服务器在哪里运行?似乎是网络设置的东西。

我的意思是SDN over REST并不快,但也不是那么慢。

你也可以分享你的课程吗?

您不应该通过电汇进行单独的属性更新。使用一次性创建所有属性的cypher语句。

还有neo4jTemplate.createNode(属性图),它将其作为一个操作。

相关问题