匹配实体

该库提供了 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 语句的标签列表。传入 null 或空列表将匹配没有任何标签约束的节点。不支持列表中的 null 或空字符串。

identProps

MAP?

null

用于 MATCH 语句的属性。

onMatchProps

MAP?

{}

匹配节点时设置的属性。

输出参数

名称 类型

node

NODE?

此过程提供了一种比 Cypher 的 MATCH 子句更灵活且性能更好的匹配节点的方式。

使用示例

以下示例展示了匹配带有 Person 标签、name 属性为 "Billy Reviewer" 的节点的等效方法

apoc.node.match
CALL apoc.node.match(
  ["Person"],
  {name: "Billy Reviewer"},
  {lastSeen: datetime()}
)
YIELD node
RETURN node;
MATCH 子句
MATCH (node:Person {name: "Billy Reviewer"})
SET node.lastSeen = datetime()
RETURN node;
表 1. 结果
node

(:Person {name: "Billy Reviewer", lastSeen: 2020-11-24T11:33:39.319Z})

但此过程主要用于匹配具有动态标签或属性的节点。例如,我们可能希望创建具有作为参数传入的标签或属性的节点。

以下创建 labelsproperties 参数

:param labels =>  (["Person"]);
:param identityProperties => ({name: "Billy Reviewer"});
:param onMatchProperties => ({placeOfBirth: "Stars of the milky way, Always at the time of sunrise."});

以下根据 labelsidentityProperties 匹配节点,并根据 onMatchProperties 设置新属性

CALL apoc.node.match($labels, $identityProperties, $onMatchProperties)
YIELD node
RETURN node;
表 2. 结果
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.matchapoc.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
表 3. 结果
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?

{}

匹配关系时设置的属性。

输出参数

名称 类型

rel

RELATIONSHIP?

使用示例

本节中的示例基于以下图谱

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 关系的等效方法

apoc.rel.match
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 子句
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;

如果我们运行这些查询,将看到如下所示的输出

表 4. 结果
rel

[:REVIEW {lastSeen: 1984-12-21, rating: 9.5}]

但此过程主要用于匹配具有动态关系类型或动态属性的关系。例如,我们可能希望匹配具有作为参数传入的类型或属性的关系。

以下创建 relationshipTypeproperties 参数

: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;
表 5. 结果
rel

[:REVIEW {lastSeen: 1984-12-21, rating: 9.5}]

此外,我们可以使用 apoc.rel.matchapoc.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
表 6. 结果
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"}]

© . All rights reserved.