2015-11-21 35 views
0

我使用嵌入式neo4j 1.9.3,会有如何提高neo4j的性能?


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

我的机器具有:

  • RAM:8 GB
  • HDD:1个TB
  • CPU:2.20 GHz的

我的配置是:

  • -Xms4g
  • -Xmx6g
  • -XX:+ UseG1GC
  • dbms.pagecache.memory =4克
  • -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(); 
    } 
} 

回答

4

你忘了tx.finish(),让您的交易永远不会关闭/ comitted。

可能您的磁盘太慢了。使用SSD。 确保禁用病毒扫描程序/磁盘加密。

提供更多可用内存也是有意义的,例如, 16G。

当您在8G机器上使用4 + 6G = 10G时,目前您可能是交换到磁盘。 将堆减至2G并将页缓存减至5G。所以你有1G的OS和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中拉出来,然后再将其从属性中拉出来? 将值存储在变量中。

+0

我应该使用tinkerpop,还是有更好的?哪个工具对于将大型rdf三元组导入属性图很有效? –

+0

直接使用Neo4j API。如果你建立了一个敏感的属性图模型,导入你的RDF结构* INTO *它。 –

+0

谢谢你。你可以分享一些关于它的链接吗? –