虚拟图
根据传入的信息创建一个图对象(Map)。
其基本结构为:{name:"Name",properties:{properties},nodes:[nodes],relationships:[relationships]}
| 限定名称 | 类型 |
|---|---|
apoc.graph.from |
|
apoc.graph.fromData |
|
apoc.graph.fromPaths |
|
apoc.graph.fromDB |
|
apoc.graph.fromCypher |
|
apoc.graph.fromDocument |
|
apoc.graph.validateDocument |
|
apoc.graph.fromDocument
存储过程 apoc.graph.fromDocument 将 JSON 转换为图结构。它接收两个参数:
-
json, 类型 Object:需要转换的 JSON。每个条目必须具有
id和type(标签名称),可通过配置参数进行自定义。
该值可以是字符串、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}':这意味着将在根对象上应用Person和Reader两个标签,包含所有属性,并且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 *
CALL apoc.graph.fromCypher('MATCH (n)-[r]->(m) RETURN *',null,'test',{answer:42})
YIELD graph
RETURN *
结果我们将获得一个用于后续处理的虚拟图对象。
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 *
结果我们将获得一个包含两个节点和一个关系的虚拟图。
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 *
结果我们将获得一个包含两个节点和一个关系的虚拟图。
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 *
结果我们将获得一个包含两个节点和一个关系的虚拟图。
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 *
结果我们将获得一个包含三个节点和两个关系的虚拟图。
如果是这个 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}])
将显示以下结果: