我使用嵌入式neo4j 1.9.3
,会有
我的机器有:
我的配置是:
我正在使用Java API进行编写和查询操作。查询速度非常好,但写入速度非常慢。那是什么原因?为了提高写入速度,我应该添加哪些配置?
以下是我的代码中的部分内容:
private static IndexManager index = Graph.graphDB.index();
private static Index<Node> allNodes = index.forNodes("allnodes");
public Node create(String value) {
Node node = super.getOrCreate("name", value);
return node;
}
public void createNode() {
try {
Transaction tx = Graph.graphDB.beginTx();
Node subject = create(RDF.getInstance().getSubject().toString());
Node object = create(RDF.getInstance().getObject().toString());
Node predicate = create(RDF.getInstance().getPredicate().toString());
Node factNode = Graph.graphDB.createNode();
factNode.createRelationshipTo(subject, RelTypes.SUBJECT);
factNode.createRelationshipTo(predicate, RelTypes.PREDICATE);
factNode.createRelationshipTo(object, RelTypes.OBJECT);
allNodes.add(subject, "name", subject.getProperty("name"));
allNodes.add(predicate, "name", predicate.getProperty("name"));
allNodes.add(object, "name", object.getProperty("name"));
tx.success();
} catch (Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:4)
您忘记了tx.finish()
,因此您的交易永远不会关闭/投放。
可能你的磁盘太慢了。使用SSD。 确保禁用病毒扫描程序/磁盘加密。
拥有更多可用内存也是有意义的,例如: 16G。
目前,您可能交换到磁盘,因为您在8G机器上使用4 + 6G = 10G。 堆减少到2G,页面缓存减少到5G。所以你有1G的操作系统和JVM。
通常,在属性图中存储RDF模型并没有多大意义。 尝试创建适当的属性图模型并将导入其中。
我还建议升级到最新版本的Neo4j 2.3.1。
或者你的代码效率不高。这些行:
Node subject = create(RDF.getInstance().getSubject().toString());
Node object = create(RDF.getInstance().getObject().toString());
Node predicate = create(RDF.getInstance().getPredicate().toString());
allNodes.add(subject, "name", subject.getProperty("name"));
allNodes.add(predicate, "name", predicate.getProperty("name"));
allNodes.add(object, "name", object.getProperty("name"));
将所有内容添加到索引中是否有意义?为什么呢?
您还应该拥有更高效的代码来访问这些属性,为什么要先将其从RFD中拉出来然后再将其从属性中拉出来? 将值存储在变量中。