虚拟图

从传入的信息创建图对象(映射)。

其基本结构为:{name:"名称",properties:{属性},nodes:[节点],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 映射或映射列表。

  • config类型 Map:配置参数

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

配置由以下参数组成:

  • write类型 boolean:持久化图,否则返回虚拟图,默认为 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 路径的语法来

    • 包含属性

    • 通过在属性名称前添加 @ 将文档属性定义为值对象

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

以下是包含映射的配置示例

{
    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
从 JSON 创建带 labelField 的虚拟图
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
从 JSON 创建带 labelField 和 idField 的虚拟图
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
© . All rights reserved.