2

我正在使用 Spring 和 Neo4j 数据库进行项目。我将我的 Neo4j 数据库配置为 rest 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 和 name 的 User 持续25 seconds

我读到这种与 neo4j 数据库的通信还没有得到很好的优化,所以我开始使用 Neo4jTemplate

这是保存用户的示例(User 中的约束是字符串(“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 和 name)并索引它需要3 秒,并且插入它连接到术语的项目需要30 秒(对于 4 个术语 - 根据我将在实际情况下拥有的 60-70 的数量)。

拜托,您能给我一些提示或其他任何可以帮助我解决此类问题的方法吗?提前致谢。

4

1 回答 1

3

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

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

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

您不应该通过网络进行单个属性更新。使用一次性创建所有属性的密码语句。

还有 neo4jTemplate.createNode(map of properties) 将其作为一个操作来完成。

于 2013-06-20T10:52:16.857 回答