虚拟图
从传入的信息创建图对象(映射)。
其基本结构为:{name:"名称",properties:{属性},nodes:[节点],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 映射或映射列表。 -
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}': 这意味着根对象将应用两个标签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}])
将显示以下结果
