我正在使用 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 的数量)。
拜托,您能给我一些提示或其他任何可以帮助我解决此类问题的方法吗?提前致谢。