|| apoc.paths.toJsonTree - APOC 核心文档 - Neo4j 文档

apoc.paths.toJsonTree

尽管其名称如此,此过程并不输出 JSON。

详情

语法

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

描述

通过遍历传出关系,创建表示图为树的嵌套文档流。

输入参数

名称

类型

描述

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

按路径长度排序结果。

使用示例

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

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.paths.toJsonTree(paths)
YIELD value
RETURN value;
结果
value
{
  _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:0",
  born: 1964,
  _type: "Person",
  name: "Keanu Reeves",
  acted_in: [
    {
      _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:8",
      `acted_in._id`: 4,
      `acted_in.roles`: ["Kevin Lomax"],
      `acted_in._elementId`: "5:53366983-cb5f-4f0d-b943-e336173d2547:4",
      _type: "Movie",
      tagline: "Evil has its winning ways",
      _id: 8,
      title: "The Devil's Advocate",
      released: 1997
    },
    {
      _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:7",
      `acted_in._id`: 3,
      `acted_in.roles`: ["Julian Mercer"],
      `acted_in._elementId`: "5:53366983-cb5f-4f0d-b943-e336173d2547:3",
      _type: "Movie",
      _id: 7,
      title: "Something's Gotta Give", released: 2003
    },
    {
      _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:6",
      `acted_in._id`: 2,
      `acted_in.roles`: ["Neo"],
      `acted_in._elementId`: "5:53366983-cb5f-4f0d-b943-e336173d2547:2",
      _type: "Movie",
      tagline: "Everything that has a beginning has an end",
      _id: 6,
      title: "The Matrix Revolutions",
      released: 2003
    },
    {
      _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:5",
      `acted_in._id`: 1,
      `acted_in.roles`: ["Neo"],
      `acted_in._elementId`: "5:53366983-cb5f-4f0d-b943-e336173d2547:1",
      _type: "Movie",
      tagline: "Free your mind",
      _id: 5,
      title: "The Matrix Reloaded",
      released: 2003
    },
    {
      _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:4",
      `acted_in._id`: 0,
      `acted_in.roles`: ["Neo"],
      `acted_in._elementId`: "5:53366983-cb5f-4f0d-b943-e336173d2547:0",
      _type: "Movie",
      tagline: "Welcome to the Real World",
      _id: 4,
      title: "The Matrix",
      released: 1999
    }
  ],
  _id: 0
}

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

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

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

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

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

以下查询演示了如何返回 James Thompson 评论的 REVIEWED 关系的 rating 属性和 Movie 节点的 title 属性

MATCH path = (p:Person {name:'James Thompson'})-[:REVIEWED]->(movie)
WITH collect(path) AS paths
CALL apoc.paths.toJsonTree(paths, true, {
  nodes: {Movie: ['title']},
  rels:  {reviewed: ['rating']}
})
YIELD value
RETURN value;
结果
value
{
  _type: "Person",
  name: "James Thompson",
  _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:3",
  reviewed: [
    {
      _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:4",
      `reviewed._elementId`: "5:53366983-cb5f-4f0d-b943-e336173d2547:10",
      _type: "Movie",
      _id: 4,
      `reviewed.rating`: 95,
      title: "The Matrix",
      `reviewed._id`: 10
    },
    {
      _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:5",
      `reviewed._elementId`: "5:53366983-cb5f-4f0d-b943-e336173d2547:11",
      _type: "Movie",
      _id: 5,
      `reviewed.rating`: 65,
      title: "The Matrix Reloaded",
      `reviewed._id`: 11
    },
    {
      _elementId: "4:53366983-cb5f-4f0d-b943-e336173d2547:6",
      `reviewed._elementId`: "5:53366983-cb5f-4f0d-b943-e336173d2547:12",
      _type: "Movie",
      _id: 6,
      `reviewed.rating`: 100,
      title: "The Matrix Revolutions",
      `reviewed._id`: 12
    }
  ],
  _id: 3
}

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

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