我正在测试neo4j以了解它如何对抗传统的RDBMS(现在我将它与PostgreSQL进行比较)。至于测试平台,我使用了示例数据库found here。
示例数据库在16个类别中有10k个产品记录。我试图将这些数据存储到数据库中,结构尽可能彼此接近。当然,由于neo4j是图形数据库而PostgreSQL是RDBMS,因此这两种结构不能完全相同。
我不打算详细介绍,我只是提供示例查询,展示如何将数据插入每个数据库:
MATCH (cr:Category:Revision) where cr.id = ?
CREATE (pe:Data:Entity:Product)-[:RevisionOf]->(pr:Data:Revision:Active:Latest:Product{title: "?", actor: "?", price: ?, special: "?"})-[:ProductCategory]->(cw:Data:Category:Wrapper)<-[:Wrapper]-(cr)
和
INSERT INTO performance.entity (entity_id, type) VALUES (DEFAULT, 'Product')
INSERT INTO performance.revision (revision_id, entity_id, user_id, create_date, fields) VALUES (DEFAULT, ?, 0, DEFAULT, ?)
INSERT INTO performance.relation (source_id, destination_id, relation) VALUES (?, ?, ?)
我不确定它是否相关,但我使用PHP脚本进行记录插入,然后我将测量该过程需要多长时间。另外,我使用PHP中的graphaware实现的neo4j bolt driver。
经过一些测试运行后,平均需要 2.5ms 来插入每个产品(三个插入SQL),而执行单个Cypher查询需要 11ms (其中一次插入3个节点)。所以neo4j比PostgreSQL慢四倍。这个数据大小足够小,可以排除内存大小的影响,并限制neo4j的打开文件数量(ulimit
)(因为据说它们是improving its performance的参数)。导入整个数据后,neo4j的data
文件夹小于25MB。
所以我的问题是,有没有人知道如何提高neo4j的写性能?
[UPDATE]
所以,我再试一次。这次我试图消除任何额外的索引或任何可能对Neo4j施加额外工作的东西。现在,我:Data(id)
只有一个约束,它实际上有助于表现(我已经对它进行了测试)。
我最新测试的结果表明,创建三个节点并匹配一个节点大约需要 10.5ms ,或多或少像以前一样。这与Postgres&#39;相比较。插入三条记录(无SELECT
) 2.5ms 的结果。
为了使事情顺利,我将Cypher命令更改为:
CREATE (pe:Data:Entity:Product)-[:RevisionOf]->(pr:Data:Revision:Active:Latest:Product{title: "?", actor: "?", price: ?, special: "?"})-[:ProductCategory]->(cw:Data:Category:Wrapper)
如您所见,此版本没有MATCH
声明,使其尽可能接近Postgres等效声明。这次,每个请求只创建了三个节点,它仍然需要 9.5ms 。
所以我的问题仍然有效,如何提高Neo4j的写性能?
[UPDATE]
此时,我确信我已经测试了我能想到的所有场景。我已经测试了三种情况:
首先,我完全删除了索引,并为每个请求插入了三个连接的节点:
CREATE (pe:Data:Entity:Product)-[:RevisionOf]->(pr:Data:Revision:Active:Latest:Product{title: "?", actor: "?", price: ?, special: "?"})-[:ProductCategory]->(cw:Data:Category:Wrapper)
在这种情况下,每个请求都需要 9.1ms 。
至于第二种情况,我也删除了标签(除了一个):
CREATE (pe:Data)-[:RevisionOf]->(pr:Data{title: "?", actor: "?", price: ?, special: "?"})-[:ProductCategory]->(cw:Data)
在第二种情况下,每个请求都需要 8ms 。
对于最后一个场景我,我从数据中删除了所有节点:
CREATE (pe:Data)-[:RevisionOf]->(pr:Data)-[:ProductCategory]->(cw:Data)
现在,每个请求都需要 5.9ms 才能完成。即使所有这些场景在实践中都没用,但他们并没有接近Postgres&#39;性能。考虑到对于Postgres,我发送了三个请求,但我还没有对它进行任何优化。
我应该放弃Neo4j吗?