我正在使用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的数量非常小)。
拜托,你能给我一些暗示或其他任何可以帮助我解决这类问题的事吗? 提前谢谢。
答案 0 :(得分:3)
这真的很奇怪,你的服务器在哪里运行?似乎是网络设置的东西。
我的意思是SDN over REST并不快,但也不是那么慢。
你也可以分享你的课程吗?
您不应该通过电汇进行单独的属性更新。使用一次性创建所有属性的cypher语句。
还有neo4jTemplate.createNode(属性图),它将其作为一个操作。