|| apoc.convert.toTree - APOC 核心文档 - Neo4j 文档

apoc.convert.toTree

此过程已被 apoc.paths.toJsonTree 废弃。

详情

语法

apoc.convert.toTree(paths [, lowerCaseRels, config ]) :: (value)

描述

返回 MAP 值流,将给定的 PATH 值表示为具有至少一个根的树。

输入参数

名称

类型

描述

paths

LIST<PATH>

要转换为树的路径列表。

lowerCaseRels

BOOLEAN

是否将关系类型转换为小写。默认值为:true

config

MAP

{ nodes = {} :: MAP, rels = {} :: MAP, sortPaths = true :: BOOLEAN }。默认值为:{}

返回参数

名称

类型

描述

value

MAP

结果树。

配置参数

此过程支持以下配置参数

配置参数
名称 类型 默认值 描述

nodes

MAP<STRING, LIST<STRING>>

{}

每个节点标签要包含或排除的属性,例如包含 {Movie: ['title']} 或排除 {Movie: ['-title']}

rels

MAP<STRING, LIST<STRING>>

{}

每个关系类型要包含或排除的属性,例如包含 {ACTED_IN: ["roles"]} 或排除 {ACTED_IN: ["-roles"]}

sortPaths

BOOLEAN

true

按路径长度对结果进行排序。

apoc.convert.toTree 和 apoc.paths.toJsonTree 之间的差异

apoc.convert.toTreeapoc.paths.toJsonTree 之间存在一些显著差异。

在简单情况下,这两个过程产生相同的输出。然而,当引入循环时,它们的行为会发生分歧。已废弃的 apoc.convert.toTree 在出现循环时会覆盖自身,提供不正确和误导性的信息。而较新的 apoc.paths.toJsonTree 则会考虑这些循环。

例如,考虑以下路径

(:A)-[:REL]->(:B)
(:A)-[:REL]->(:C)
(:B)-[:REL]->(:C)
(:B)-[:REL]->(:B)
(:C)-[:REL]->(:A)
apoc.convert.toTree 将输出 3 条记录
MATCH path = ()-[]->()
WITH collect(path) AS paths
CALL apoc.convert.toTree(paths)
YIELD value
RETURN value
简化输出
(:A)
(:B)
(:C)-[:REL]->(:A)
apoc.paths.toJsonTree 将输出 1 条记录
MATCH path = ()-[]->()
WITH collect(path) AS paths
CALL apoc.paths.toJsonTree(paths)
YIELD value
RETURN value
简化输出
(:A)-[:REL]->(:B)-[:REL]->(:B)
                        ->(:C)
           ->(:C)-[:REL]->(:A)

用法示例

本节中的示例基于以下样本图

CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (TomH:Person {name:'Tom Hanks', born:1956})
CREATE (TomT:Person {name:'Tom Tykwer', born:1965})
CREATE (JamesThompson:Person {name:'James Thompson'})

CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (TheMatrixReloaded:Movie {title:'The Matrix Reloaded', released:2003, tagline:'Free your mind'})
CREATE (TheMatrixRevolutions:Movie {title:'The Matrix Revolutions', released:2003, tagline:'Everything that has a beginning has an end'})
CREATE (SomethingsGottaGive:Movie {title:"Something's Gotta Give", released:2003})
CREATE (TheDevilsAdvocate:Movie {title:"The Devil's Advocate", released:1997, tagline:'Evil has its winning ways'})

CREATE (YouveGotMail:Movie {title:"You've Got Mail", released:1998, tagline:'At odds in life... in love on-line.'})
CREATE (SleeplessInSeattle:Movie {title:'Sleepless in Seattle', released:1993, tagline:'What if someone you never met, someone you never saw, someone you never knew was the only someone for you?'})
CREATE (ThatThingYouDo:Movie {title:'That Thing You Do', released:1996, tagline:'In every life there comes a time when that thing you dream becomes that thing you do'})
CREATE (CloudAtlas:Movie {title:'Cloud Atlas', released:2012, tagline:'Everything is connected'})

CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrixReloaded)
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrixRevolutions)
CREATE (Keanu)-[:ACTED_IN {roles:['Julian Mercer']}]->(SomethingsGottaGive)
CREATE (Keanu)-[:ACTED_IN {roles:['Kevin Lomax']}]->(TheDevilsAdvocate)

CREATE (TomH)-[:ACTED_IN {roles:['Joe Fox']}]->(YouveGotMail)
CREATE (TomH)-[:ACTED_IN {roles:['Sam Baldwin']}]->(SleeplessInSeattle)
CREATE (TomH)-[:ACTED_IN {roles:['Mr. White']}]->(ThatThingYouDo)
CREATE (TomH)-[:ACTED_IN {roles:['Zachry', 'Dr. Henry Goose', 'Isaac Sachs', 'Dermot Hoggins']}]->(CloudAtlas)
CREATE (TomT)-[:DIRECTED]->(CloudAtlas)

CREATE (JamesThompson)-[:REVIEWED {summary:'Enjoyed it!', rating:95}]->(TheMatrix)
CREATE (JamesThompson)-[:REVIEWED {summary:'It was alright.', rating:65}]->(TheMatrixReloaded)
CREATE (JamesThompson)-[:REVIEWED {summary:'The best of the three', rating:100}]->(TheMatrixRevolutions);

以下将基努·里维斯电影的路径列表转换为嵌套映射

MATCH path = (p:Person {name: "Keanu Reeves"})-[:ACTED_IN]->(movie)
WITH collect(path) AS paths
CALL apoc.convert.toTree(paths)
YIELD value
RETURN value;
结果
value
{
   "_type":"Person",
   "name":"Keanu Reeves",
   "acted_in":[
      {
         "acted_in.roles":[
            "Kevin Lomax"
         ],
         "_type":"Movie",
         "tagline":"Evil has its winning ways",
         "title":"The Devil's Advocate",
         "released":1997,
         "_id": 8,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:8",
         "acted_in._id": "4",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:4"
      },
      {
         "_type":"Movie",
         "title":"Something's Gotta Give",
         "acted_in.roles":[
            "Julian Mercer"
         ],
         "released":2003,
         "_id":7,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:7",
         "acted_in._id": "3",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:3"
      },
      {
         "acted_in.roles":[
            "Neo"
         ],
         "_type":"Movie",
         "tagline":"Everything that has a beginning has an end",
         "title":"The Matrix Revolutions",
         "released":2003,
         "_id":6,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:6",
         "acted_in._id": "2",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:2"
      },
      {
         "acted_in.roles":[
            "Neo"
         ],
         "_type":"Movie",
         "tagline":"Free your mind",
         "title":"The Matrix Reloaded",
         "released":2003,
         "_id":5,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:5",
         "acted_in._id": "1",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:1"
      },
      {
         "acted_in.roles":[
            "Neo"
         ],
         "_type":"Movie",
         "tagline":"Welcome to the Real World",
         "title":"The Matrix",
         "released":1999,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:4",
         "_id":4,
         "acted_in._id": "0",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:0"
      }
   ],
   "_id":0,
  "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:0",
   "born":1964
}

默认情况下,关系类型会转换为小写。要保留原始大小写,请将第二个参数(lowerCaseRels)设置为 false

MATCH path = (p:Person {name: "Keanu Reeves"})-[:ACTED_IN]->(movie)
WITH collect(path) AS paths
CALL apoc.convert.toTree(paths, false)
YIELD value
RETURN value;
结果
value
{
   "_type":"Person",
   "name":"Keanu Reeves",
   "ACTED_IN":[
      {
         "ACTED_IN.roles":[
            "Kevin Lomax"
         ],
         "_type":"Movie",
         "tagline":"Evil has its winning ways",
         "title":"The Devil's Advocate",
         "released":1997,
         "_id": 8,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:8",
         "acted_in._id": "4",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:4"
      },
      {
         "_type":"Movie",
         "title":"Something's Gotta Give",
         "released":2003,
         "ACTED_IN.roles":[
            "Julian Mercer"
         ],
         "_id":7,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:7",
         "acted_in._id": "3",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:3"
      },
      {
         "ACTED_IN.roles":[
            "Neo"
         ],
         "_type":"Movie",
         "tagline":"Everything that has a beginning has an end",
         "title":"The Matrix Revolutions",
         "released":2003,
         "_id":6,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:6",
         "acted_in._id": "2",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:2"
      },
      {
         "ACTED_IN.roles":[
            "Neo"
         ],
         "_type":"Movie",
         "tagline":"Free your mind",
         "title":"The Matrix Reloaded",
         "released":2003,
         "_id":5,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:5",
         "acted_in._id": "1",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:1"
      },
      {
         "ACTED_IN.roles":[
            "Neo"
         ],
         "_type":"Movie",
         "tagline":"Welcome to the Real World",
         "title":"The Matrix",
         "released":1999,
         "_id":4,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:4",
         "acted_in._id": "0",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:0"
      }
   ],
   "_id":0,
  "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:0",
   "born":1964
}

默认情况下,节点标签和关系类型的所有属性都包含在内。要限制节点的属性,请使用 nodes 配置键。对于关系类型,请使用 rels 配置键。

以下查询演示了如何通过设置 nodes 配置键来仅返回 Movie 节点的 title 属性

MATCH path = (p:Person {name: "Keanu Reeves"})-[:ACTED_IN]->(movie)
WITH collect(path) AS paths
CALL apoc.convert.toTree(paths, true, {
  nodes: {Movie: ['title']}
})
YIELD value
RETURN value;
结果
value
{
   "_type":"Person",
   "name":"Keanu Reeves",
   "acted_in":[
      {
         "_type":"Movie",
         "title":"The Devil's Advocate",
         "acted_in.roles":[
            "Kevin Lomax"
         ],
         "_id":8,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:8",
         "acted_in._id": "4",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:4"
      },
      {
         "_type":"Movie",
         "title":"Something's Gotta Give",
         "acted_in.roles":[
            "Julian Mercer"
         ],
         "_id":7,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:7",
         "acted_in._id": "3",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:3"
      },
      {
         "_type":"Movie",
         "title":"The Matrix Revolutions",
         "acted_in.roles":[
            "Neo"
         ],
         "_id":6,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:6",
         "acted_in._id": "2",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:2"
      },
      {
         "_type":"Movie",
         "title":"The Matrix Reloaded",
         "acted_in.roles":[
            "Neo"
         ],
         "_id":5,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:5",
         "acted_in._id": "1",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:1"
      },
      {
         "_type":"Movie",
         "title":"The Matrix",
         "acted_in.roles":[
            "Neo"
         ],
         "_id":4,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:4",
         "acted_in._id": "0",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:0"
      }
   ],
   "born":1964,
   "_id":0,
   "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:0"
}

以下查询演示了如何仅返回 James Thompson 评论的 REVIEWED rating 以及 Movie 节点的 title

MATCH path = (p:Person {name:'James Thompson'})-[:REVIEWED]->(movie)
WITH collect(path) AS paths
CALL apoc.convert.toTree(paths, true, {
  nodes: {Movie: ['title']},
  rels:  {reviewed: ['rating']}
})
YIELD value
RETURN value;
结果
value
{
   "_type":"Person",
   "name":"James Thompson",
   "reviewed":[
      {
         "_type":"Movie",
         "reviewed.rating":95,
         "title":"The Matrix",
         "_id":4,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:4",
         "acted_in._id": "10",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:10"
      },
      {
         "_type":"Movie",
         "reviewed.rating":100,
         "title":"The Matrix Revolutions",
         "_id":6,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:6",
         "acted_in._id": "12",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:12"
      },
      {
         "_type":"Movie",
         "reviewed.rating":65,
         "title":"The Matrix Reloaded",
         "_id":5,
         "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:5",
         "acted_in._id": "11",
         "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:11"
      }
   ],
   "_id":3,
   "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:3"
}

也可以通过在属性前加上减号(-)来明确排除某些属性。以下查询演示了如何排除 Movie 节点上的 title 属性和 REVIEWED 关系上的 rating 属性。

MATCH path = (p:Person {name:'James Thompson'})-[:REVIEWED]->(movie)
WITH collect(path) AS paths
CALL apoc.convert.toTree(paths, true, {
  nodes: {Movie: ['-title']},
  rels:  {reviewed: ['-rating']}
})
YIELD value
RETURN value;
结果
value
{
  "_type": "Person",
  "name": "James Thompson",
  "reviewed": [
    {
      "_type": "Movie",
      "tagline": "Everything that has a beginning has an end",
      "reviewed.summary": "The best of the three",
      "released": 2003,
      "_id":6,
      "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:6",
      "acted_in._id": "12",
      "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:12"
    },
    {
      "_type": "Movie",
      "tagline": "Free your mind",
      "reviewed.summary": "It was alright.",
      "released": 2003,
      "_id":5,
      "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:5",
      "acted_in._id": "11",
      "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:11"
    },
    {
      "_type": "Movie",
      "tagline": "Welcome to the Real World",
      "reviewed.summary": "Enjoyed it!",
      "released": 1999,
      "_id":4,
      "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:4",
      "acted_in._id": "10",
      "acted_in._elementId": "5:98db296d-ab2a-4b84-a341-69a5144babb1:10"
    }
  ],
   "_id":3,
   "_elementId": "4:98db296d-ab2a-4b84-a341-69a5144babb1:3"
}
© . This site is unofficial and not affiliated with Neo4j, Inc.