Cypher查询Neo4j ForEach合并返回?

时间:2014-03-21 15:44:24

标签: neo4j cypher

所以我试图发送一个将合并多个节点的查询,我希望查询返回它创建的节点,但是我不能将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}]
         }

2 个答案:

答案 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样式查找之前,它可能值得一试。基本上它意味着将一些小图结构维护为瞬态(查询本地或查询类型本地)索引。在这种情况下,

  1. 通过创建(查询 - 本地)或合并(查询类型 - 本地)索引节点来开始查询
  2. 将所有合并的节点与它相关联
  3. 以及返回从索引节点到创建节点的匹配时间
  4. 删除关系(以及查询本地的索引节点)并返回。
  5. 我目前无法对此进行测试,但你可以尝试这样的事情

    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
    

    (对于您的查询类型,这可能有点过分。如果您尝试它,请尝试分析查询,与从标签索引重新获取并回发相比。)