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

 赵博钧石博 发布于 2022-12-12 17:41

我想在我的应用程序中使用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

结果:

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

问题:

    除了优化cypher子句和使用批量插入之外,还有其他方法可以提高写入性能吗?我已经尝试过配置不同大小的jvm堆和对象缓存的方法.我发现它对写入性能的影响较小,我认为原因可能是节点/关系的规模很小(从数千到数万),在大规模的节点/关系中效率可能很高(千万,数十亿)

    根据您在十亿个节点/关系中的经验,neo4j的读写性能可以达到多少nps或rps?

    我还发现neo4j不能自动进行分片,但是文档中有一个关于基于缓存的分片的部分,如果我使用HAproxy进行基于缓存的分片,那么分析到不同机器的节点之间的关系怎么样?保持?也就是说,关系不会被分片打破.

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

提前致谢.

问候

1 个回答
    1. 你必须做不同的请求吗?我建议您使用事务性密码端点:http://nigelsmall.com/py2neo/1.6/cypher/#id2

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

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

      我不确定,但我很确定所有集群功能都来自企业.

    2022-12-12 17:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有