【问题标题】:Output all direct neighbours in a JSON object输出 JSON 对象中的所有直接邻居
【发布时间】:2017-01-28 16:28:44
【问题描述】:

是否可以在 Cypher 中编写查询以将以下查询的输出格式化为 JSON 对象?

MATCH (n:Artist{name:'Metallica'})-[r]->(m:Album) 返回{节点:n,邻居:{ type(r): collect(m) }}

当然,这不是有效的 Cypher 查询。我正在尝试查看是否有任何方法可以编写生成此处提出的概念的查询?另一个问题(type(r): 除外)是m,它需要按type(r) 分组。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    正如Gabor Szarnyas 所说,在当前的密码实现中,不可能完全按照您的意愿行事。但是您可以使用来自APOC 库的用户定义过程apoc.map.fromPairs 来做到这一点:

    MATCH (n:Artist {name:'Metallica'})-[r]->(m:Album)
    WITH n, type(r) AS relType, collect(m) AS albums
    WITH n, collect([relType, albums]) as pairs
    CALL apoc.map.fromPairs( pairs ) YIELD value as neighbours
    RETURN { node: n, neighbours: neighbours }
    

    【讨论】:

    • 谢谢,只是在 neo4j 3.1 中似乎应该是 RETURN apoc.map.fromPairs( pairs ) 而没有 CALL
    【解决方案2】:

    您可以使用map literals 构建地图。根据其文档:

    在 Cypher 中,您还可以构建地图。通过 REST 你会得到 JSON 对象;在 Java 中,它们将是 java.util.Map<String,Object>

    但是,您必须提前指定映射中的键 - 您不能使用变量/表达式(例如 type(r) 的值)作为键。我能达到的最接近您的要求如下:

    MATCH (n:Artist {name:'Metallica'})-[r]->(m:Album)
    WITH n, type(r) AS albumType, collect(m) AS albums
    RETURN { node: n, works: collect({ type: albumType, albums: albums }) }
    

    (查询在语法上是正确的,但我没有对任何数据进行测试。)

    另请参阅此相关问题:Cypher query with literal map syntax & dynamic keys

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2016-04-06
      • 2016-02-01
      相关资源
      最近更新 更多