在Neo4J Cypher 2.0中创建多个节点/边缘时,最好是发出一个合并请求,还是将其拆分为事务?

在Neo4J Cypher 2.0中创建多个节点/边缘时,最好是发出一个合并请求,还是将其拆分为事务?,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我有一个长的Cypher查询(新的neo4j2.0版本),它使用MERGE命令创建多个节点和连接 问题是:你认为我最好把它分成不同的部分并作为事务提交(为了健壮性),还是应该保留长的单个事务(为了速度) 问题是: MATCH (u:User {name: "User"}) MERGE (tag1:Hashtag {name:"tag1"}) MERGE (tag2:Hashtag {name:"tag2"}) MERGE (tag3:Hashtag {name:"tag3"}) MERG

我有一个长的Cypher查询(新的neo4j2.0版本),它使用MERGE命令创建多个节点和连接

问题是:你认为我最好把它分成不同的部分并作为事务提交(为了健壮性),还是应该保留长的单个事务(为了速度)

问题是:

MATCH (u:User {name: "User"}) MERGE (tag1:Hashtag {name:"tag1"}) MERGE (tag2:Hashtag    
{name:"tag2"}) MERGE (tag3:Hashtag {name:"tag3"}) MERGE (tag4:Hashtag {name:"tag4"}) 
MERGE tag1-[:BY]->u MERGE tag2-[:BY]->u MERGE tag3-[:BY]->u MERGE tag4-[:BY]->u;

(我特意缩短了请求,假设有50个标记(节点)和更多的边,例如)

只要您的查询语句不是数百行,并且创建的数据不超过50k个元素,我就坚持使用一个查询

但是您应该使用参数

我还将使用foreach和参数重写您的查询

MATCH (u:User {name: {userName}) 
FOREACH (tagName in {tags} | 
    MERGE (tag:Hashtag {name:tagName}) 
    MERGE (tag)-[:BY]->(u)
)
参数:

{userName:"User", tags: ["tag1",...,"tagN"]}

谢谢你,迈克尔!我最初的查询比我发布的查询要复杂一些,所以这会很困难,但我会试试。在这种情况下,FOREACH循环的优点是什么?我已经在我的JavaScript代码中进行了迭代以产生类似的结果,但是直接在Cypher中进行比较好吗?如果您可以将数据库中的工作移动到一个http请求而不是多个http请求,那么它会更好地利用系统资源。您能解释一下为什么不建议使用一个查询吗?