所以我试图发送一个将合并多个节点的查询,我希望查询返回它创建的节点,但是我不能将return语句放在FOREACH中,所以我在那里一种收集节点然后在最后返回该集合的方法吗?
FOREACH (tagName in {tags} |
MERGE (n:items {classid:tagName.pClassid})
ON CREATE
COLLECT(n) as allCreatedNodes)
RETURN allCreatedNodes;
"params" : {
"tags": [{"pClassid" : 1}, {"pClassid" : 2}, {"pClassid" : 3}]
}
答案 0 :(得分:2)
现在很遗憾不可能。
你唯一可以做的事情(如果你真的需要它是在事后查看节点。不幸的是,IN
使用MATCH
尚未优化。
FOREACH (tagName in {tags} | MERGE (n:items {classid:tagName.pClassid}))
WITH [t IN {tags} | t.pClassid ] as classIds
MATCH (allCreatedNodes:items)
WHERE allCreatedNodes.classid IN classIds
RETURN allCreatedNodes;
答案 1 :(得分:0)
您可以尝试的一件事是创建一个临时图形结构,以便在foreach之后快速查找节点。如果标签集很小,它可能不值得,但它有时是一个有用的策略,并且在标签索引处理IN collection
样式查找之前,它可能值得一试。基本上它意味着将一些小图结构维护为瞬态(查询本地或查询类型本地)索引。在这种情况下,
我目前无法对此进行测试,但你可以尝试这样的事情
CREATE (index)
FOREACH (tagName in {tags} |
MERGE (n:items {classid:tagName.pClassid} )
CREATE index-[:TRANSIENT]->n
)
WITH index
MATCH index-[t:TRANSIENT]->n
DELETE t, index
RETURN n
(对于您的查询类型,这可能有点过分。如果您尝试它,请尝试分析查询,与从标签索引重新获取并回发相比。)