使用py2neo时写下关于neo4j的性能

时间:2014-11-07 02:13:51

标签: performance neo4j py2neo

我正在尝试在我的应用程序中使用neo4j。现在我面临一些批评 实验中的问题。问题陈述分为如此 几个部分。

背景:

用例是从互联网获取数据,数据规模是亿, 场景是实时的,关系只是人与人之间的几个 属性。

配置:

机器配置:

  cpu: 24 processors, Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz
  memory: 165 203 696 kB
  jdk: java version "1.7.0_67",  Java(TM) SE Runtime Environment (build 1.7.0_67-b01),  Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
  Linux version: 2.6.32-431.el6.x86_64
  OS: CentOS release 6.5

Neo4j配置:

  enterprise version: 2.1.5
  jvm heap: default
  objects cache:
  neostore.nodestore.db.mapped_memory=512M
  neostore.relationshipstore.db.mapped_memory=6G
  neostore.propertystore.db.mapped_memory=5G
  neostore.propertystore.db.strings.mapped_memory=1G
  neostore.propertystore.db.arrays.mapped_memory=1G

客户端配置:

  pyneo, version 1.6.4

客户代码:

CYPHER_WEIGHT_COMPUTE='r.weight=r.weight+r.weight*EXP((TIMESTAMP()-r.update_time)/(r.half_life*1.0))'

// Initiation, create constraints according the label on id
self.query=neo.CypherQuery(self.graph_db,'CREATE CONSTRAINT ON (pn:UID)
ASSERT pn.id IS UNIQUE')
self.query.execute()
self.query=neo.CypherQuery(self.graph_db,'CREATE CONSTRAINT ON (pm:GID)
ASSERT pm.id IS UNIQUE')
self.query.execute()

// Cypher clause
MERGE(first:{TYPE1} {{id:'{val1}'}})
MERGE (second:{TYPE2} {{id:'{val2}'}})
MERGE (first)-[r:{RTYPE}]->(second) ON CREATE SET r.weight={weight_set} ON
MATCH SET {weight_compute}
WITH r
SET r.half_life={half_life},
    r.update_time=TIMESTAMP(),
    r.threshold={threshold}
WITH r
WHERE r.weight<r.threshold
DELETE r

self.query=neo.CypherQuery(self.graph_db,self.create_rels.
     format(TYPE1=entity1[0],val1=entity1[1],
            TYPE2=entity2[0],val2=entity2[1],
            RTYPE=rel_type,weight_set=weight_set,

weight_compute=CYPHER_WEIGHT_COMPUTE,half_life=half_life,threshold=threshold))

结果:

当我使用python的24个python线程编写59229个节点时,236048 关系,531325属性。平均时间费用约为1316 秒。结果不能满足我的实时需求,它对我来说效果很好 如果时间费用减少到150秒。每个人的时间费用 当数据规模增加时,节点/关系将增加

问题:

  1. 除了有什么其他方法可以改善写性能 优化cypher子句并使用批量插入?我试过了 配置不同大小的jvm堆和对象缓存的方法。我发现了 它对写入性能的影响较小,我认为原因可能就是 小规模的节点/关系(从数千到数万), 节点/关系的大规模效率可能很大( 千万,数十亿)

  2. neo4j的读写性能达到了多少nps或rps 您在十亿个节点/关系中的经验?

  3. 我还发现neo4j不能自动进行分片,但有 关于文档中基于缓存的分片的一节,如果我使用基于缓存的 使用HAproxy进行分片,如何才能使节点之间的关系具有 一直在分析到不同的机器维护?那就是说 关系不会被分片打破。

  4. 主/从模式可以在社区和企业版中使用吗?

  5. 提前致谢。

    此致

1 个答案:

答案 0 :(得分:5)

  1. 您必须以不同的要求执行这些操作吗?我建议您使用事务性密码端点:http://nigelsmall.com/py2neo/1.6/cypher/#id2

  2. 取决于所使用的查询和API。以及计数读写的方法。使用事务性http API,我设法每秒获得30k cypher create语句,其中包含两个节点和一个rel。合并速度要慢一些,您需要确保使用约束索引。

  3. 我们的想法是通过允许用户子集(或您可以定义的子集)在特定群集节点上进行查询来保留缓存的数据子集。如果查询需要遵循的关系未被缓存,则最终将从磁盘读取。所有数据必须位于群集中所有成员的磁盘上。

  4. 我不确定,但我非常确定所有群集功能都来自企业。