我正在尝试在我的应用程序中使用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秒。每个人的时间费用 当数据规模增加时,节点/关系将增加
问题:
除了有什么其他方法可以改善写性能 优化cypher子句并使用批量插入?我试过了 配置不同大小的jvm堆和对象缓存的方法。我发现了 它对写入性能的影响较小,我认为原因可能就是 小规模的节点/关系(从数千到数万), 节点/关系的大规模效率可能很大( 千万,数十亿)
neo4j的读写性能达到了多少nps或rps 您在十亿个节点/关系中的经验?
我还发现neo4j不能自动进行分片,但有 关于文档中基于缓存的分片的一节,如果我使用基于缓存的 使用HAproxy进行分片,如何才能使节点之间的关系具有 一直在分析到不同的机器维护?那就是说 关系不会被分片打破。
主/从模式可以在社区和企业版中使用吗?
提前致谢。
此致
答案 0 :(得分:5)
您必须以不同的要求执行这些操作吗?我建议您使用事务性密码端点:http://nigelsmall.com/py2neo/1.6/cypher/#id2
取决于所使用的查询和API。以及计数读写的方法。使用事务性http API,我设法每秒获得30k cypher create语句,其中包含两个节点和一个rel。合并速度要慢一些,您需要确保使用约束索引。
我们的想法是通过允许用户子集(或您可以定义的子集)在特定群集节点上进行查询来保留缓存的数据子集。如果查询需要遵循的关系未被缓存,则最终将从磁盘读取。所有数据必须位于群集中所有成员的磁盘上。
我不确定,但我非常确定所有群集功能都来自企业。