【问题标题】:Cypher Query Neo4j ForEach Merge return?Cypher 查询 Neo4j ForEach 合并返回?
【发布时间】:2014-03-21 15:44:24
【问题描述】:

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    不幸的是,目前这是不可能的。

    您唯一可以做的事情(如果您真的需要它是事后查找节点。不幸的是,使用 INMATCH 尚未优化。

    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;
    

    【讨论】:

    • 是的,这似乎是一个可能的解决方案
    【解决方案2】:

    您可以尝试的一件事是创建一个临时图形结构,以便在 foreach 之后快速查找节点。如果标签集合很小,这可能不值得,但它有时是一个有用的策略,直到标签索引处理 IN collection 样式查找它可能值得一试。基本上,这意味着将一些小的图结构维护为临时(查询本地或查询类型本地)索引。在这种情况下,

    1. 通过创建(本地查询)或合并(本地查询)索引节点开始查询
    2. 将所有合并的节点与其关联
    3. 以及何时将匹配项从索引节点返回到创建的节点
    4. 删除关系(如果查询本地,则删除索引节点)并返回。

    我目前无法测试,但您可以尝试类似的方法

    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
    

    (对于您的查询类型来说,这可能是多余的。如果您尝试这样做,请尝试对查询进行分析,并与从标签索引重新获取并回发进行比较。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2023-01-28
      • 2013-07-31
      相关资源
      最近更新 更多