Neo4j存储具有大属性的节点的问题

时间:2014-12-17 07:40:17

标签: java json rest neo4j

我尝试使用Java通过CYPHER在Neo4j中创建一些节点,更具体地说是使用JSON和http://hostname:7474/db/data/transaction/commit

我的测试应该使用以下CYPHER语句创建一些节点:

MERGE (a:LABEL1 { name: 'nameNNN', version: 1001 })
SET a.PROP1='<data>'
RETURN id(a)

只要很小,例如一个或多个属性&lt;总和1kB,一切正常。如果尝试写入具有更大属性的节点(10MB二进制数据base64编码为 例如),测试创建了9个或10个节点:

{errors=[], results=[{"data":[{"row":[10009]}],"columns":["id(a)"]}]}
{errors=[], results=[{"data":[{"row":[10010]}],"columns":["id(a)"]}]}
...
{errors=[], results=[{"data":[{"row":[10011]}],"columns":["id(a)"]}]}

然后开始返回:

{errors=[], results=[]}

如果我重新开始测试,我会立即得到空的结果。如果我重新启动Neo4j服务器, 我可以更新这9或10个节点,也可以创建9个或10个不同名称的节点 然后我再次得到空的结果。

据我所知,每个语句都是一个事务(我为每个服务器请求执行一次合并)。

这是一个错误,还是社区版的限制(2.1.6)还是我做错了什么?

2 个答案:

答案 0 :(得分:1)

它是Neo4j在房产中存储大块blob数据的极少数反模式之一。建议的方法是将它们移动到适合大blob的数据存储区(例如Amazon S3和其他),并在Neo4j中保留对它们的URI引用。

因此,表示blob内容的节点具有指向外部blob存储的uri属性。

答案 1 :(得分:0)

如果我在查询中使用参数而不是数据,则不会出现问题。谢谢你的提示!