虚拟图

根据传入的信息创建一个图对象(Map)。

其基本结构为:{name:"Name",properties:{properties},nodes:[nodes],relationships:[relationships]}

限定名称 类型

apoc.graph.from
apoc.graph.from(data ANY, name STRING, props MAP<STRING, ANY>) - 通过从给定数据中提取所有 NODERELATIONSHIP 值来生成虚拟子图。

过程

apoc.graph.fromData
apoc.graph.fromData(nodes LIST<NODE>, rels LIST<RELATIONSHIP>, name STRING, props MAP<STRING, ANY>) - 通过从给定数据中提取所有 NODERELATIONSHIP 值来生成虚拟子图。

过程

apoc.graph.fromPaths
apoc.graph.fromPaths(paths LIST<PATH>, name STRING, props MAP<STRING, ANY>) - 通过从给定 PATH 值返回的数据中提取所有 NODERELATIONSHIP 值来生成虚拟子图。

过程

apoc.graph.fromDB
apoc.graph.fromDB(name STRING, props MAP<STRING, ANY>) - 通过从给定数据库返回的数据中提取所有 NODERELATIONSHIP 值来生成虚拟子图。

过程

apoc.graph.fromCypher
apoc.graph.fromCypher(statement STRING, params MAP<STRING, ANY>, name STRING, props MAP<STRING, ANY>) - 通过从给定 Cypher 语句返回的数据中提取所有 NODERELATIONSHIP 值来生成虚拟子图。

过程

apoc.graph.fromDocument
apoc.graph.fromDocument(json ANY, config MAP<STRING, ANY>) - 通过从给定 JSON 文件返回的数据中提取所有 NODERELATIONSHIP 值来生成虚拟子图。

过程

apoc.graph.validateDocument
apoc.graph.validateDocument(json ANY, config MAP<STRING, ANY>) - 验证 JSON 文件并返回验证结果。

过程

apoc.graph.fromDocument

存储过程 apoc.graph.fromDocument 将 JSON 转换为图结构。它接收两个参数:

  • json, 类型 Object:需要转换的 JSON。每个条目必须具有 idtype(标签名称),可通过配置参数进行自定义。
    该值可以是字符串、Cypher Map 或 Map 列表。

  • config, 类型 Map:配置参数

目前尚不支持处理空间数据和日期时间属性。未来版本将提供更高级的文档映射配置。

配置由以下参数组成:

  • write, 类型 boolean:是否持久化保存图,否则返回一个虚拟图(Virtual Graph),默认值为 false

  • labelField, 类型 String:作为节点标签的字段名称,默认值为 type

  • idField, 类型 String:作为创建节点 id 字段的文档字段名称(用于在节点间创建关系时进行节点解析),默认值为 id

  • generateId, 类型 boolean:若缺失 id 字段值,则为其生成 UUID,默认值为 true

  • defaultLabel, 类型 String:若缺失标签字段值,则使用提供的默认标签,默认值为空

  • skipValidation, 类型 boolean:是否跳过 apoc.graph.fromDocument 过程中的验证,默认值为 false

  • mappings, 类型 MAP<STRING, STRING>:可以使用类似 JSON path 的语法:

    • 包含属性

    • 通过在属性名前添加 @,将文档属性定义为值对象(value objects)

    • 通过在属性名前添加 !,定义每个标签的自定义/复合键

以下是带有映射配置的示例

{
    write: false,
    idField: "id",
    mappings: {
      `$`: 'Person:Reader{*,@size}'
      `$.books`: 'Book{!title, released}'
    }
}

让我们描述这些映射

  • $: 'Person:Reader{*,@size}':这意味着将在根对象上应用 PersonReader 两个标签,包含所有属性,并且 size 属性将被转换为值对象。可以看到没有指定 id,因此我们将 idField 中定义的属性视为 id。

  • $.books: 'Book{!title, released}':这意味着根对象的 books 属性将被转换为带有 Book 标签的节点,该节点由两个属性组成:title(被视为 id,用 ! 标记)和 released。此外,该属性将通过 BOOKS 关系连接到类型为 Person:Reader 的父节点。

{
    "id": 1,
    "type": "artist",
    "name": "Genesis",
    "members": ["Tony Banks", "Mike Rutherford", "Phil Collins"],
    "years": [1967, 1998, 1999, 2000, 2006]
}

在这种情况下,它会创建一个带有 Artist 标签的 NODE

它也接受文档列表。

[{
    "id": 1,
    "type": "artist",
    "name": "Genesis",
    "members": ["Tony Banks", "Mike Rutherford", "Phil Collins"],
    "years": [1967, 1998, 1999, 2000, 2006]
}, {
    "id": 2,
    "type": "artist",
    "name": "Daft Punk",
    "members": ["Guy-Manuel de Homem-Christo", "Thomas Bangalter."],
    "years": [1987, 1993, 1999, 2004, 2008, 2011]
}]

在这种情况下,它会创建 2 个带有 Artist 标签的 NODE

JSON 树转为图

{
	"id": 1,
	"type": "artist",
	"name": "Genesis",
	"albums": [{
		"type": "album",
		"id": 1,
		"producer": "Jonathan King",
		"title": "From Genesis to Revelation"
	}]
}

在这种情况下,它将创建 2 个 NODE,一个是 Artist,一个是 Album,它们通过 ALBUMS Relationship 相互连接。

apoc.graph.validateDocument

存储过程 apoc.graph.validateDocument 对 JSON 进行验证,并返回有关必填字段违规的信息。

它接收与 apoc.graph.fromDocument 相同的参数。

虚拟图示例

我们为示例创建一个数据集。

CREATE (a:Actor {name:'Tom Hanks'})-[r:ACTED_IN {roles:'Forrest'}]->(m:Movie {title:'Forrest Gump'})
RETURN *
基于数据创建虚拟图。
MATCH (n)-[r]->(m) CALL apoc.graph.fromData([n,m],[r],'test',{answer:42})
YIELD graph
RETURN *
基于路径创建虚拟图。
MATCH path = (n)-[r]->(m) CALL apoc.graph.fromPath(path,'test',{answer:42})
YIELD graph
RETURN *
基于多个路径创建虚拟图。
MATCH path = (n)-[r]->(m) CALL apoc.graph.fromPaths([path],'test',{answer:42})
YIELD graph
RETURN *
基于数据库创建虚拟图。
CALL apoc.graph.fromDB('test',{answer:42})
YIELD graph
RETURN *
基于 Cypher 查询创建虚拟图。
CALL apoc.graph.fromCypher('MATCH (n)-[r]->(m) RETURN *',null,'test',{answer:42})
YIELD graph
RETURN *

结果我们将获得一个用于后续处理的虚拟图对象。

apoc.graph
基于 JSON 创建虚拟图。
CALL apoc.graph.fromDocument("{'id': 1,'type': 'artist','name':'Genesis','members': ['Tony Banks','Mike Rutherford','Phil Collins'],'years': [1967, 1998, 1999, 2000, 2006],'albums': [{'type': 'album','id': 1,'producer': 'Jonathan King','title': 'From Genesis to Revelation'}]}", {write: false})
YIELD graph
RETURN *

结果我们将获得一个包含两个节点和一个关系的虚拟图。

apoc.graph.fromDocument 1
带 labelField 的 JSON 虚拟图。
CALL apoc.graph.fromDocument('{"id":10,"myCustomType":"labelArtist","name":"Genesis","albums":[{"myCustomType":"labelAlbum","producer":"Jonathan King","id":20,"title":"From Genesis to Revelation"}]}', {labelField: "myCustomType"})
YIELD graph
RETURN *

结果我们将获得一个包含两个节点和一个关系的虚拟图。

apoc.graph.fromDocument with label type
带 labelField 和 idField 的 JSON 虚拟图。
CALL apoc.graph.fromDocument('{"myCustomType":"labelArtist","name":"Genesis","myCustomId":1,"albums":[{"myCustomType":"labelAlbum","producer":"Jonathan King","myCustomId":1,"title":"From Genesis to Revelation"}]}',
{labelField: "myCustomType", idField: "myCustomId"})
YIELD graph
RETURN *

结果我们将获得一个包含两个节点和一个关系的虚拟图。

apoc.graph.fromDocument with label type and id field
带映射的 JSON 虚拟图。
CALL apoc.graph.fromDocument('{"id":1,"type":"Person","name":"Andrea","sizes":{"weight":{"value":70,"um":"Kg"},"height":{"value":174,"um":"cm"},"array":["foo","bar"]},"books":[{"title":"Flow My Tears, the Policeman Said","released":1974},{"title":"The man in the High Castle","released":1962}]}',
{mappings:{`$`:"Person:Reader{*,@sizes}",`$.books`:"Book{!title, released}"}})
yield graph
RETURN *

结果我们将获得一个包含三个节点和两个关系的虚拟图。

apoc.graph.fromDocument with mappings

如果是这个 json

{
    "id": 1,
    "type": "Person",
    "name": "Andrea",
    "sizes": {
        "weight": {
            "value": 70,
            "um": "Kg"
        },
        "height": {
            "value": 174,
            "um": "cm"
        }
    }
}

你可以将 sizes 属性作为值对象进行管理,操作如下:

call apoc.graph.validateDocument(<json>, {mappings: {`$`: "Person{*,@sizes}"}})

因此,该过程将创建一个具有以下属性的节点:

{
    "id": 1,
    "type": "Person",
    "name": "Andrea",
    "sizes.weight.value": 70,
    "sizes.weight.um": "Kg",
    "sizes.height.value": 174,
    "sizes.height.um": "cm"
}

如前所述,你还可以为标签提供一组值对象属性。

call apoc.graph.validateDocument(<json>, {mappings: {`$`: "Person{*,@sizes}"}})

你还可以使用 apoc.graph.validateDocument 存储过程对文档进行预验证,它将返回包含无效数据的记录。

call apoc.graph.validateDocument('[{"foo": "foo"}, {"bar": "bar", "id": 1, "type": "label"}, {"fooBar": "fooBar", "id": 1}]')

call apoc.graph.validateDocument([{foo: "foo"}, {bar: "bar", id: 1, type: "label"}, {fooBar: "fooBar", id: 1}])

将显示以下结果:

apoc.graph.validateDocument