创建数据
APOC 库包含增强 Neo4j 写入功能的过程。其中许多过程支持动态数据创建,例如动态添加节点标签。
要了解如何使用 Neo4j 用户创新高级总监 Michael Hunger 提供的 APOC 库动态创建节点和关系,请观看此视频
动态创建数据的函数
限定名称 | 类型 |
---|---|
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
|
过程 |
示例
以下示例将进一步解释这些过程。
移除节点标签
只要标签是硬编码的,Cypher 就支持删除标签。如果标签是动态指定的,则可以使用 `apoc.create.removeLabels` 过程。
CREATE (jennifer:Person:US {name: "Jennifer", community: 1, partition: 4})
CREATE (karin:Person:US {name: "Karin", community: 4, partition: 2})
CREATE (mark:Person:UK {name: "Mark", community: 3, partition: 3})
CALL db.labels()
YIELD label WHERE label <> "Person"
WITH collect(label) AS labels
MATCH (p:Person)
WITH collect(p) AS people, labels
CALL apoc.create.removeLabels(people, labels)
YIELD node
RETURN node, labels(node) AS labels
节点 | 标签 |
---|---|
(:Person {name: "Jennifer", partition: 4, community: 1}) |
["Person"] |
(:Person {name: "Karin", partition: 2, community: 4}) |
["Person"] |
(:Person {name: "Mark", partition: 3, community: 3}) |
["Person"] |
设置节点和关系属性
只要属性名称是硬编码的,Cypher 就支持设置属性。如果属性名称是动态指定的,请使用 `apoc.create.setProperties` 和 `apoc.create.setRelProperties` 过程。
CREATE (jennifer:Person {name: "Jennifer", community: 1, partition: 4})
CREATE (karin:Person {name: "Karin", community: 4, partition: 2})
CREATE (elaine:Person {name: "Elaine", community: 3, partition: 3})
MERGE (jennifer)-[:FRIENDS {since: datetime("2019-06-01")}]-(karin)
MERGE (jennifer)-[:FRIENDS {since: datetime("2019-05-04")}]-(elaine)
MATCH (p:Person)
WITH p, keys(p) AS keys
CALL apoc.create.setProperties(p,[k in keys | k + "Copy"], [k in keys | p[k]])
YIELD node
RETURN node
节点 |
---|
{"name":"Jennifer","partition":4,"community":1,"nameCopy":"Jennifer","partitionCopy":4,"communityCopy":1} |
{"name":"Karin","partition":2,"community":4,"nameCopy":"Karin","partitionCopy":2,"communityCopy":4} |
{"name":"Mark","partition":3,"community":3,"nameCopy":"Mark","partitionCopy":3,"communityCopy":3} |
MATCH (:Person)-[friends:FRIENDS]->(:Person)
WITH friends, keys(friends) AS keys
CALL apoc.create.setRelProperties(friends,[k in keys | k + "Copy"], [k in keys | friends[k]])
YIELD rel
RETURN startNode(rel) AS start, rel, endNode(rel) AS end
开始 | 关系 | 结束 |
---|---|---|
{ "name": "Jennifer", "partition": 4, "community": 1, "nameCopy": "Jennifer", "partitionCopy": 4, "communityCopy": 1 } |
{ "sinceCopy": "2019-05-04T00:00:00Z", "since": "2019-05-04T00:00:00Z" } |
{ "name": "Elaine", "partition": 3, "community": 3, "nameCopy": "Elaine", "partitionCopy": 3, "communityCopy": 3 } |
{ "name": "Jennifer", "partition": 4, "community": 1, "nameCopy": "Jennifer", "partitionCopy": 4, "communityCopy": 1 } |
{ "sinceCopy": "2019-06-01T00:00:00Z", "since": "2019-06-01T00:00:00Z" } |
{ "name": "Karin", "partition": 2, "community": 4, "nameCopy": "Karin", "partitionCopy": 2, "communityCopy": 4 } |
移除节点和关系属性
只要属性名称是硬编码的,Cypher 就支持删除属性。如果属性名称是动态指定的,请使用 `apoc.create.removeProperties` 和 `apoc.create.removeRelProperties` 过程。
CREATE (jennifer:Person {name: "Jennifer", community: 1, partition: 4})
CREATE (karin:Person {name: "Karin", community: 4, partition: 2})
CREATE (elaine:Person {name: "Elaine", community: 3, partition: 3})
MERGE (jennifer)-[:FRIENDS {since: datetime("2019-06-01")}]-(karin)
MERGE (jennifer)-[:FRIENDS {since: datetime("2019-05-04")}]-(elaine)
CALL db.propertyKeys()
YIELD propertyKey WHERE propertyKey <> "name"
WITH collect(propertyKey) AS propertyKeys
MATCH (p:Person)
WITH collect(p) AS nodes, propertyKeys
CALL apoc.create.removeProperties(nodes, propertyKeys)
YIELD node
RETURN node
节点 |
---|
{"name":"Jennifer"} |
{"name":"Karin"} |
{"name":"Elaine"} |
CALL db.propertyKeys()
YIELD propertyKey
WITH collect(propertyKey) AS propertyKeys
MATCH (:Person)-[friends:FRIENDS]->(:Person)
WITH collect(friends) AS friendsRels, propertyKeys
CALL apoc.create.removeRelProperties(friendsRels, propertyKeys)
YIELD rel
RETURN startNode(rel) AS start, rel, endNode(rel) AS end
开始 | 关系 | 结束 |
---|---|---|
{"name":"Jennifer"} |
{} |
{"name":"Elaine"} |
{"name":"Jennifer"} |
{} |
{"name":"Karin"} |
链表
apoc.nodes.link
可用于创建节点链表。MATCH (e:Event)
WITH e ORDER BY e.date
WITH collect(e) AS events
CALL apoc.nodes.link(events, "NEXT")
RETURN count(*);
以下创建一个节点链表
apoc.nodes.link
可用于创建节点链表。MATCH (e:Event)
WITH e ORDER BY e.date
WITH collect(e) AS events, count(e) as size
CALL {
WITH events, size
UNWIND range(0, size - 2) as i
WITH events[i] as a, events[i+1] as b
MERGE (a)-[:NEXT]->(b)
}
RETURN events