【问题标题】:Neo4j cypher query collect in collectNeo4j 密码查询收集收集
【发布时间】:2014-12-30 10:17:48
【问题描述】:

我有一个问题:

start brand=node(62) match  brand-[:CREATED_A]->(campaign:Campaign)<-->(node) 
return DISTINCT  brand,campaign,collect(node) ;

现在结果几乎如我所愿。我缺少的一件事是我想要具有以下层次结构:

品牌有很多广告系列,广告系列有很多与之相连的节点,因此品牌中的广告系列中有很多节点。

目前,该广告系列多次返回到每个返回的广告系列。

【问题讨论】:

    标签: neo4j match cypher


    【解决方案1】:

    我提供了一个Neo4j Gist 来说明解决方案。简而言之,它使用文字映射来格式化数据,并使用两次收集来确保品牌不会多次出现。

    MATCH 
        (brand:Brand)-[:CREATED_A]->(campaign:Campaign)<-->(node)
    WITH 
        brand, 
        { 
            campaign : campaign, 
            nodes : COLLECT(node)
        } AS campaigns
    WITH 
        { 
            brand : brand, 
            campaigns : COLLECT(campaigns)
        } AS brands
    RETURN brands
    

    这会使品牌出现一次,您的输出就会得到一个很好的格式。

    【讨论】:

      【解决方案2】:

      Cypher 是一种非常强大的语言。如果您知道要从节点获取哪些属性,您甚至可以返回一个类似 json 的输出,该输出还维护您在图中实际建模的结构,您可以执行以下操作:

      MATCH (brand:Brand)-[:CREATED_A]->(campaign:Campaign)<-->(node)
      WITH 
          brand, 
          campaign as campaign,
          COLLECT({
               property1 : node.property1,
               property2 : node.property2
          }) as nodes
      RETURN 
          { 
              name : brand.name,
              logoUrl : brand.logoUrl,
              campaigns : COLLECT({
                  name : campaign.name,
                  timestamp : campaign.timestamp,
                  nodes : nodes
              })
          } as brands
      

      这会输出一个json结构如:

      [
          {
              name : "my name",
              logoUrl : "http://www...",
              campaigns : [
                  {
                      name : "my campaign name",
                      timestamp : 1484172044462,
                      nodes : [
                          {
                              property1 : "property1",
                              property2 : "property2"
                          }
                      ]
                   }
               ]
          }
      ]
      

      这实际上很好地反映了您的图形模型。

      此外,由于您没有执行 RETURN COLLECT(...),因此您可以迭代 Record 结果,而不是获取第一个(也是唯一一个)记录并将所有行放入其中。当您处于嵌入式服务器等情况时,这可能是一种方便的方式,您可以在其中实际流式传输结果数据而不是一次性检索它。

      即使您没有任何集合(例如,一个活动只有一个节点)并且路径变得更深,这种方法也很有效。 但是,当您的模型是一棵树(或更糟糕的是,一个图)时,您可能会遇到挑战。

      您可以在这个不错的要点中找到更多详细信息: https://gist.github.com/rherschke/9269173

      【讨论】:

        猜你喜欢
        • 2017-05-02
        • 1970-01-01
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        相关资源
        最近更新 更多