如何提高neo4j的性能?

时间:2015-11-21 19:20:07

标签: performance configuration neo4j

我使用嵌入式neo4j 1.9.3,会有

  • 节点:3亿
  • 关系:6亿
  • 每个节点的属性:1
  • 每个关系的属性:1

我的机器有:

  • RAM:8 GB
  • HDD:1 TB
  • CPU:2.20 ghz

我的配置是:

  • -Xms4g
  • -Xmx6g
  • -XX:+ UseG1GC
  • dbms.pagecache.memory = 4g
  • -XX:+ UseG1GC

我正在使用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();
    }
}

1 个答案:

答案 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中拉出来然后再将其从属性中拉出来? 将值存储在变量中。