写入关系
为了在 Neo4j 数据库中持久化关系类型,我们可以使用 `gds.graph.relationship.write`。与流式传输关系拓扑或属性类似,也可以写回 Neo4j 数据库。这类似于算法 `write` 执行模式的作用,但允许更细粒度地控制操作。
默认情况下,不会写入任何关系属性。要写入关系属性,必须显式指定这些属性。
语法
CALL gds.graph.relationship.write(
graphName: String,
relationshipType: String,
relationshipProperty: String,
configuration: Map
)
YIELD
writeMillis: Integer,
graphName: String,
relationshipType: String,
relationshipsWritten: Integer,
relationshipProperty: String,
propertiesWritten: Integer,
configuration: Map
名称 | 类型 | 可选 | 描述 |
---|---|---|---|
graphName |
字符串 |
否 |
图在目录中存储的名称。 |
relationshipType |
字符串 |
否 |
图中要写回的关系类型。 |
relationshipProperty |
字符串 |
是 |
要写回的关系属性。 |
configuration |
映射 |
是 |
配置 writeRelationship 的其他参数。 |
名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
concurrency |
整数 |
4 |
用于运行过程的并发线程数。还提供 `writeConcurrency` 的默认值。请注意,此过程始终以单线程运行。 |
writeConcurrency |
整数 |
'concurrency' |
用于写入关系属性的并发线程数。请注意,此过程始终以单线程运行。 |
名称 | 类型 | 描述 |
---|---|---|
writeMillis |
整数 |
将结果数据写回 Neo4j 的毫秒数。 |
graphName |
字符串 |
存储在目录中的图的名称。 |
relationshipType |
字符串 |
已写入的关系的类型。 |
relationshipsWritten |
整数 |
已写入的关系数。 |
relationshipProperty |
字符串 |
已写入的关系属性的名称。 |
propertiesWritten |
整数 |
已写入的关系属性数。 |
configuration |
映射 |
用于运行过程的配置。 |
CALL gds.graph.relationshipProperties.write(
graphName: String,
relationshipType: String,
relationshipProperties: List of String,
configuration: Map
)
YIELD
writeMillis: Integer,
graphName: String,
relationshipType: String,
relationshipsWritten: Integer,
relationshipProperties: List of String,
propertiesWritten: Integer,
configuration: Map
名称 | 类型 | 可选 | 描述 |
---|---|---|---|
graphName |
字符串 |
否 |
图在目录中存储的名称。 |
relationshipType |
字符串 |
否 |
图中要写回的关系类型。 |
relationshipProperties |
字符串 |
是 |
要写回的关系属性。 |
configuration |
映射 |
是 |
配置过程的其他参数。 |
名称 | 类型 | 描述 |
---|---|---|
writeMillis |
整数 |
将结果数据写回 Neo4j 的毫秒数。 |
graphName |
字符串 |
存储在目录中的图的名称。 |
relationshipType |
字符串 |
已写入的关系的类型。 |
relationshipsWritten |
整数 |
已写入的关系数。 |
relationshipProperties |
字符串 |
已写入的关系属性的名称。 |
propertiesWritten |
整数 |
已写入的关系属性数。 |
configuration |
映射 |
用于运行过程的配置。 |
示例
以下所有示例都应在空数据库中运行。 这些示例使用 Cypher 投影 作为规范。原生投影将在未来版本中弃用。 |
我们可以将存储在命名内存图中的关系写回 Neo4j。这可用于写入算法结果(例如来自 节点相似性)或在图创建期间已聚合的关系。
要写入的关系由关系类型指定。
关系始终使用单个线程写入。 |
为了演示 GDS 在节点属性上的功能,我们将创建一个小的 Neo4j 图并将其投影到我们的图目录中。
CREATE
(alice:Person {name: 'Alice'}),
(bob:Person {name: 'Bob'}),
(carol:Person {name: 'Carol'}),
(dave:Person {name: 'Dave'}),
(eve:Person {name: 'Eve'}),
(guitar:Instrument {name: 'Guitar'}),
(synth:Instrument {name: 'Synthesizer'}),
(bongos:Instrument {name: 'Bongos'}),
(trumpet:Instrument {name: 'Trumpet'}),
(alice)-[:LIKES { score: 5 }]->(guitar),
(alice)-[:LIKES { score: 4 }]->(synth),
(alice)-[:LIKES { score: 3, strength: 0.5}]->(bongos),
(bob)-[:LIKES { score: 4 }]->(guitar),
(bob)-[:LIKES { score: 5 }]->(synth),
(carol)-[:LIKES { score: 2 }]->(bongos),
(dave)-[:LIKES { score: 3 }]->(guitar),
(dave)-[:LIKES { score: 1 }]->(synth),
(dave)-[:LIKES { score: 5 }]->(bongos)
MATCH (person:Person)-[r:LIKES]->(instr:Instrument)
RETURN gds.graph.project(
'personsAndInstruments',
person,
instr,
{
sourceNodeLabels: labels(person),
targetNodeLabels: labels(instr),
relationshipType: type(r),
relationshipProperties: r { .score, strength: coalesce(r.strength, 1.0) }
}
)
CALL gds.nodeSimilarity.mutate('personsAndInstruments', { (1)
mutateRelationshipType: 'SIMILAR', (2)
mutateProperty: 'score' (3)
})
1 | 在投影的 `personsAndInstruments` 图上以 `mutate` 模式运行 NodeSimilarity。 |
2 | 该算法将向投影的图中添加类型为 `SIMILAR` 的关系。 |
3 | 该算法将为每个添加的关系添加关系属性 `score`。 |
关系类型
CALL gds.graph.relationship.write(
'personsAndInstruments', (1)
'SIMILAR' (2)
)
YIELD
graphName, relationshipType, relationshipProperty, relationshipsWritten, propertiesWritten
1 | 投影图的名称。 |
2 | 我们要写回 Neo4j 数据库的关系类型。 |
graphName | relationshipType | relationshipProperty | relationshipsWritten | propertiesWritten |
---|---|---|---|---|
"personsAndInstruments" |
"SIMILAR" |
null |
10 |
0 |
默认情况下,不会写入任何关系属性,从结果可以看出,`relationshipProperty` 值为 `null`,`propertiesWritten` 为 `0`。
以下是执行上述示例后示例图在 Neo4j 中的外观。
SIMILAR
关系已添加到底层数据库中,可用于 Cypher 查询或投影到内存图中以运行算法。此示例中的关系是无向的,因为我们使用节点相似性来修改内存图,并且此算法创建无向关系,如果我们使用不同的算法,则可能并非如此。
具有属性的关系类型
要写入关系属性,必须显式指定这些属性。
CALL gds.graph.relationship.write(
'personsAndInstruments', (1)
'SIMILAR', (2)
'score' (3)
)
YIELD
graphName, relationshipType, relationshipProperty, relationshipsWritten, propertiesWritten
1 | 投影图的名称。 |
2 | 我们要写回 Neo4j 数据库的关系类型。 |
3 | 我们要写入 Neo4j 数据库的关系的属性名称。 |
graphName | relationshipType | relationshipProperty | relationshipsWritten | propertiesWritten |
---|---|---|---|---|
"personsAndInstruments" |
"SIMILAR" |
"score" |
10 |
10 |
具有多个属性的关系类型
为了演示将具有多个属性的关系写回 Neo4j,我们将首先在数据库中创建一个小型图。
CREATE
(alice:Buyer {name: 'Alice'}),
(instrumentSeller:Seller {name: 'Instrument Seller'}),
(bob:Buyer {name: 'Bob'}),
(carol:Buyer {name: 'Carol'}),
(alice)-[:PAYS { amount: 1.0}]->(instrumentSeller),
(alice)-[:PAYS { amount: 2.0}]->(instrumentSeller),
(alice)-[:PAYS { amount: 3.0}]->(instrumentSeller),
(alice)-[:PAYS { amount: 4.0}]->(instrumentSeller),
(alice)-[:PAYS { amount: 5.0}]->(instrumentSeller),
(alice)-[:PAYS { amount: 6.0}]->(instrumentSeller),
(bob)-[:PAYS { amount: 3.0}]->(instrumentSeller),
(bob)-[:PAYS { amount: 4.0}]->(instrumentSeller),
(carol)-[:PAYS { amount: 5.0}]->(bob),
(carol)-[:PAYS { amount: 6.0}]->(bob)
MATCH (buyer:Buyer)-[r:PAYS]->(seller:Buyer|Seller)
WITH buyer, seller, sum(r.amount) AS totalAmount, count(r.amount) AS numberOfPayments
RETURN gds.graph.project(
'aggregatedGraph',
buyer,
seller,
{
sourceNodeLabels: labels(buyer),
targetNodeLabels: labels(seller),
relationshipType: 'PAID',
relationshipProperties: { totalAmount: totalAmount, numberOfPayments: numberOfPayments }
}
)
我们可以看到 Neo4j 图包含一些并行关系。我们使用 GDS 投影将它们压缩成节点之间的单个关系。在本例中,我们希望跟踪某人支付给某人的次数以及所有付款的总金额。
要写入关系属性,必须显式指定这些属性。
CALL gds.graph.relationshipProperties.write(
'aggregatedGraph', (1)
'PAID', (2)
['totalAmount', 'numberOfPayments'], (3)
{}
)
YIELD
graphName, relationshipType, relationshipProperties, relationshipsWritten, propertiesWritten
1 | 投影图的名称。 |
2 | 我们要写回 Neo4j 数据库的关系类型。 |
3 | 我们要写入 Neo4j 数据库的关系的属性名称。 |
graphName | relationshipType | relationshipProperties | relationshipsWritten | propertiesWritten |
---|---|---|---|---|
"aggregatedGraph" |
"PAID" |
["totalAmount", "numberOfPayments"] |
3 |
6 |