繁体   English   中英

密码查询:将聚合值分配为关系的属性

[英]Cypher query: Assigning an aggregate value as a property of a relationship

根据这个问题 ,我有以下玩具示例:

CREATE (A1:Worker {ref:"A1"})
CREATE (A2:Worker {ref:"A2"})

CREATE (B1:Worker {ref:"B1"})
CREATE (B2:Worker {ref:"B2"})

CREATE (A1)-[:StreamsTo {type:"stream1"}]->(B1)
CREATE (A1)-[:StreamsTo {type:"stream2"}]->(B1)
CREATE (A1)-[:StreamsTo {type:"stream3"}]->(B1)
CREATE (A1)-[:StreamsTo {type:"stream1"}]->(B2)
CREATE (A1)-[:StreamsTo {type:"stream2"}]->(B2)

CREATE (A2)-[:StreamsTo {type:"stream1"}]->(B1)
CREATE (A2)-[:StreamsTo {type:"stream1"}]->(B2)
CREATE (A2)-[:StreamsTo {type:"stream2"}]->(B2);

这将产生以下图形:

玩具实例图

我想做的是计算离开源节点的每种流类型的路由概率(RP),该概率为1 /该类型的传出关系的数量。 我可以使用以下查询计算RP值:

MATCH (source:Worker)-[st:StreamsTo]->(:Worker) 
RETURN source.ref as Worker, 
       st.type as StreamType, 
       COUNT(st) as OutgoingCount,
       1.0 / COUNT(st) as RP
ORDER BY source.ref, st.type;

结果是:

╒════════╤════════════╤═══════════════╤════╕
│"Worker"│"StreamType"│"OutgoingCount"│"RP"│
╞════════╪════════════╪═══════════════╪════╡
│"A1"    │"stream1"   │2              │0.5 │
├────────┼────────────┼───────────────┼────┤
│"A1"    │"stream2"   │2              │0.5 │
├────────┼────────────┼───────────────┼────┤
│"A1"    │"stream3"   │1              │1   │
├────────┼────────────┼───────────────┼────┤
│"A2"    │"stream1"   │2              │0.5 │
├────────┼────────────┼───────────────┼────┤
│"A2"    │"stream2"   │1              │1   │
└────────┴────────────┴───────────────┴────┘

因此,我现在需要做的是获取每个源节点(Worker)和流类型组合的计算出的RP值,并将该值添加为离开给定源节点的该类型的每个关系的属性。

我知道我可以使用WITH将上面查询的输出传递给新查询。 但是,我坚持如何将总RP值应用于来自具有给定属性的给定源的所有关系? 我已经知道在cypher中可以将结果收集到地图中,但是我不确定如何在查询中使用它?

我可以在应用程序端执行此操作,但是如果可能的话,显然希望在服务器端执行此操作。

这是使用collect()UNWIND的解决方案:

MATCH (source:Worker)-[st:StreamsTo]->(:Worker) 
// do the calculations, collection st relations into sts array
WITH collect(st) as sts, source.ref as Worker, 
       st.type as StreamType, 
       COUNT(st) as OutgoingCount,
       1.0 / COUNT(st) as RP

// expanding sts list to st rows
UNWIND sts as st
// set the property sr.RP = RP
set st.RP = RP

// collect st again to avoid a cartesian product
WITH collect(st) as sts, Worker, StreamType, OutgoingCount, RP

// return desired data, ordering
return Worker, StreamType, OutgoingCount, RP
ORDER BY Worker, StreamType

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM