匹配实体
该库提供了 2 个用于匹配实体的过程
-
apoc.node.match
-
apoc.rel.match
匹配节点
"apoc.node.match(['Label'], identProps:{key:value, …}, onMatchProps:{key:value,…})" - 匹配具有动态标签的节点,支持在匹配到的节点上设置属性
签名
apoc.node.match(label :: LIST? OF STRING?, identProps :: MAP?, onMatchProps = {} :: MAP?) :: (node :: NODE?)
输入参数
名称 | 类型 | 默认 | 描述 |
---|---|---|---|
labels |
LIST? OF STRING? |
null |
用于生成 MATCH 语句的标签列表。传入 |
identProps |
MAP? |
null |
用于 MATCH 语句的属性。 |
onMatchProps |
MAP? |
{} |
匹配节点时设置的属性。 |
使用示例
以下示例展示了匹配带有 Person
标签、name
属性为 "Billy Reviewer" 的节点的等效方法
CALL apoc.node.match(
["Person"],
{name: "Billy Reviewer"},
{lastSeen: datetime()}
)
YIELD node
RETURN node;
MATCH (node:Person {name: "Billy Reviewer"})
SET node.lastSeen = datetime()
RETURN node;
node |
---|
(:Person {name: "Billy Reviewer", lastSeen: 2020-11-24T11:33:39.319Z}) |
但此过程主要用于匹配具有动态标签或属性的节点。例如,我们可能希望创建具有作为参数传入的标签或属性的节点。
以下创建 labels
和 properties
参数
:param labels => (["Person"]);
:param identityProperties => ({name: "Billy Reviewer"});
:param onMatchProperties => ({placeOfBirth: "Stars of the milky way, Always at the time of sunrise."});
以下根据 labels
和 identityProperties
匹配节点,并根据 onMatchProperties
设置新属性
CALL apoc.node.match($labels, $identityProperties, $onMatchProperties)
YIELD node
RETURN node;
node |
---|
(:Person {name: "Billy Reviewer", lastSeen: 2020-11-24T11:33:39.319Z, placeOfBirth: "Stars of the milky way, Always at the time of sunrise."}) |
此外,我们可以使用 apoc.node.match
与 apoc.load.json
结合,从 JSON 动态设置节点。
例如,给定以下数据集
CREATE (giacomo:Person:Actor {name: 'Giacomino Poretti'}),
(aldo:Person:Actor {name: 'Cataldo Baglio'}),
(giovanni:Person:Actor {name: 'Giovanni Storti'})
以及以下 all.json
文件
[
{
"labels":[
"Person",
"Actor"
],
"matchProps":{
"name":"Giacomino Poretti"
},
"setProps":{
"bio":"Giacomo Poretti was born on April 26 1956 in Busto Garolfo",
"Alias":"Tafazzi"
}
},
{
"labels":[
"Person",
"Actor"
],
"matchProps":{
"name":"Giovanni Storti"
},
"setProps":{
"bio":"Giovanni Storti was born ...",
"Alias":"Rezzonico"
}
},
{
"labels":[
"Person",
"Actor"
],
"matchProps":{
"name":"Cataldo Baglio"
},
"setProps":{
"bio":"Cataldo Baglio was born somewhere",
"Alias":"Ajeje"
}
}
]
我们可以执行以下查询来 MATCH 和 SET Person:Actor
节点
CALL apoc.load.json("all.json") YIELD value
WITH value
CALL apoc.node.match(value.labels, value.matchProps, value.setProps)
YIELD node
RETURN node
node |
---|
(:Actor:Person {name: "Giacomino Poretti",bio: "Giacomo Poretti was born on April 26 1956 in Busto Garolfo",Alias: "Tafazzi"}) |
(:Actor:Person {name: "Giovanni Storti",bio: "Giovanni Storti was born …",Alias: "Rezzonico"}) |
(:Actor:Person {name: "Cataldo Baglio",bio: "Cataldo Baglio was born somewhere",Alias: "Ajeje"}) |
匹配关系
"apoc.rel.match(startNode, relType, identProps:{key:value, …}, endNode, onMatchProps:{key:value, …})" - 匹配具有动态类型的关系,支持在匹配时设置属性
签名
apoc.rel.match(startNode :: NODE?, relationshipType :: STRING?, identProps :: MAP?, endNode :: NODE?, onMatchProps = {} :: MAP?) :: (rel :: RELATIONSHIP?)
输入参数
名称 | 类型 | 默认 | 描述 |
---|---|---|---|
startNode |
NODE? |
null |
MATCH 模式的起始节点。 |
relationshipType |
STRING? |
null |
MATCH 模式的关系类型。 |
identProps |
MAP? |
null |
用于 MATCH 语句的关系上的属性。 |
endNode |
NODE? |
null |
MATCH 模式的结束节点。 |
onMatchProps |
MAP? |
{} |
匹配关系时设置的属性。 |
使用示例
本节中的示例基于以下图谱
CREATE (p:Person {name: "Billy Reviewer"})
CREATE (m:Movie {title:"spooky and goofy movie"})
CREATE (p)-[REVIEW {lastSeen: date("1984-12-21")}]->(m);
此过程提供了一种比 Cypher 的 MATCH
子句更灵活且性能更好的匹配关系的方式。
以下示例展示了匹配 Billy Reviewer
和 Movie 节点之间的 REVIEW
关系的等效方法
MATCH (p:Person {name: "Billy Reviewer"})
MATCH (m:Movie {title:"spooky and goofy movie"})
CALL apoc.rel.match(
p, "REVIEW",
{lastSeen: date("1984-12-21")},
m, {rating: 9.5}
)
YIELD rel
RETURN rel;
MATCH (p:Person {name: "Billy Reviewer"})
MATCH (m:Movie {title:"spooky and goofy movie"})
MATCH (p)-[rel:REVIEW {lastSeen: date("1984-12-21")}]->(m)
SET rel.rating = 9.5
RETURN rel;
如果我们运行这些查询,将看到如下所示的输出
rel |
---|
[:REVIEW {lastSeen: 1984-12-21, rating: 9.5}] |
但此过程主要用于匹配具有动态关系类型或动态属性的关系。例如,我们可能希望匹配具有作为参数传入的类型或属性的关系。
以下创建 relationshipType
和 properties
参数
:param relType => ("REVIEW");
:param identityProperties => ({lastSeen: date("1984-12-21")});
以下根据先前定义的参数匹配具有类型和属性的关系
MATCH (bill:Person {name: "Billy Reviewer"})
MATCH (movie:Movie {title:"spooky and goofy movie"})
CALL apoc.rel.match(bill, $relType, $identityProperties, movie, {}})
YIELD rel
RETURN rel;
rel |
---|
[:REVIEW {lastSeen: 1984-12-21, rating: 9.5}] |
此外,我们可以使用 apoc.rel.match
与 apoc.load.json
结合,从 JSON 动态设置节点。
例如,给定以下数据集
CREATE (giacomo:Person:Actor {name: 'Giacomino Poretti'}),
(aldo:Person:Actor {name: 'Cataldo Baglio'}),
(m:Movie {title: 'Three Men and a Leg', `y:ear`: 1997, `mean-rating`: 8, `release date`: date('1997-12-27')})
WITH aldo, m
CREATE (aldo)-[:ACTED_IN {role: 'Aldo'}]->(m),
(aldo)-[:DIRECTED {role: 'Director'}]->(m)
以及以下 all.json
文件(请注意,它利用了起始和结束节点的 elementId,因此值是可变的)
[
{
"startNodeId": "4:b3d54d7b-2c64-4994-9a26-0bb2aa175291:0",
"endNodeId": "4:b3d54d7b-2c64-4994-9a26-0bb2aa175291:0",
"type":"ACTED_IN",
"matchProps":{
"role":"Aldo"
},
"setProps":{
"ajeje":"Brazorf",
"conte":"Dracula"
}
},
{
"startNodeId": "4:b3d54d7b-2c64-4994-9a26-0bb2aa175291:0",
"endNodeId": "4:b3d54d7b-2c64-4994-9a26-0bb2aa175291:0",
"type":"DIRECTED",
"matchProps":{
"role":"Director"
},
"setProps":{
"description": "did stuff..",
"alias":"i dunnoaaaaaa"
}
}
]
我们可以执行以下查询来 MATCH 和 SET 关系
CALL apoc.load.json("all.json") YIELD value
WITH value
WHERE elementId(start) = value.startNodeId AND elementId(end) = value.endNodeId
CALL apoc.rel.match(start, value.type, value.matchProps, end, value.setProps)
YIELD rel
RETURN rel
rel |
---|
[:ACTED_IN {role: "Aldo",conte: "Dracula",ajeje: "Brazorf"}] |
(:Actor:Person {name: "Giovanni Storti",bio: "Giovanni Storti was born …",Alias: "Rezzonico"}) |
[:DIRECTED {bio: "did stuff..",alias: "i dunno",role: "Director"}] |