如何在Neo4j中持续增加,Cypher太慢了?

如何在Neo4j中持续增加,Cypher太慢了?,neo4j,cypher,Neo4j,Cypher,Im目前使用Neo4j 2.0+和cypher创建和保存会话 我的项目有时需要每秒多次写入标记为“ChildSession”的节点,我注意到,当我在cypher中“递增”ChildSession\u ID时,我经常会跳过ChildSession\u ID的数字或是相同的数字 不确定neo4j/cypher对于我的要求是否太慢,但我对此表示怀疑,因为内部neo4j节点ID通常会递增 The cypher command i'm using, to increment ChildSession is

Im目前使用Neo4j 2.0+和cypher创建和保存会话

我的项目有时需要每秒多次写入标记为“ChildSession”的节点,我注意到,当我在cypher中“递增”ChildSession\u ID时,我经常会跳过ChildSession\u ID的数字或是相同的数字

不确定neo4j/cypher对于我的要求是否太慢,但我对此表示怀疑,因为内部neo4j节点ID通常会递增

The cypher command i'm using, to increment ChildSession is:

 match (p:ChildSession) with count(p) as Total 
 Create (b:ChildSession{ChildSession_ID:Total + 1 })
人们期望ChildSession_ID会增加,但当我在neo4j浏览器中检查节点时,我得到了以下结果:

match (u:ChildSession) return u,ID(u)

Results:
ChildSession_ID 1
44997
ChildSession_ID 1
44998
ChildSession_ID 1
44999
ChildSession_ID 4
45000
ChildSession_ID 5
45001
ChildSession_ID 6
45002
ChildSession_ID 6
45003
ChildSession_ID 8
45004
ChildSession_ID 8
45005
我一直无法使neo4j精确地增加。 我尝试使用redis及其hincrby命令,该命令递增,然后将该变量放入cypher查询的ChildSession_ID属性中。这种方法是有效的,但我宁愿用cypher来代替

这个论点可以被用来代替redis进行快速写操作,但我使用了会话级别的层次结构,需要neo4j提供的查询功能


谢谢。

您是否在访问ChildSession标签时添加了手动锁定?否则,
MATCH
语句可能会同时发生在多个线程上(无读取锁定)。其结果将是传递给
CREATE
语句的
Total
的值相同

我突然想到两件事,使用计数可能不是最快的,而且如果您要删除一个ChildSession(也许您不在乎?),也不能保证值的唯一性。将计数维护为属性可能更快(查询时间),并且开销最小

我认为,实现这一点的正确方法是在单独的标签上使用MERGE语句,该语句应在整个事务中锁定
增量
节点(如中所述):

警告:虽然我相信这是正确的方法,但如果它在快速异步环境中工作得很好,我会被诅咒,这表明锁定的语义不是我所期望的


如果ChildSession\u ID的增量性质不重要,您当然可以生成UUID?

虽然增量以正常速度工作,但在我这样做时,当每秒添加多个节点时,它不会像预期的那样增量。可能是neo4j的问题,但我采用UUID方法。我能够通过使用redis的hincrby命令来完成增量。谢谢+1
MERGE (nid:Incremental{type:ChildSession})
ON CREATE SET nid.count = 1
ON MATCH SET nid.count = nid.count + 1
RETURN nid.count