假设我有一个这样的图表(原谅伪代码):
(A)-[:RSVP {reply:true}]->(X)
(B)-[:RSVP {reply:true}]->(X)
(C)-[:RSVP {reply:false}]->(X)
如何获得积极回应的比率?我期待的结果会给我0.66的接受率。
答案 0 :(得分:1)
我用这种方式模拟了你的数据:
CREATE (A), (B), (C), (X {label: "party time"})
MERGE (A)-[:RSVP {reply:true}]->(X)
MERGE (B)-[:RSVP {reply:true}]->(X)
MERGE (C)-[:RSVP {reply:false}]->(X);
然后,通过此查询,我们可以简单地计算"是" s"和#34;不是"分开,用简单的除法创造比例:
MATCH (X {label:"party time"})
MATCH (X)<-[:RSVP {reply:true}]-(yeses),
(X)<-[:RSVP {reply:false}]-(nos)
RETURN count(distinct(yeses))/count(distinct(nos));
我得到的答案是2,因为有2个,1个没有。 (2/1 => 2
)
答案 1 :(得分:1)
使用@FrobberOfBits的示例数据,以下是一个更通用的查询,它会处理一些特殊情况(否则会导致Cypher出现“/ by zero”错误)。
false
RSVP,则查询返回字符串“Infinity”。否则,查询返回yeses与nos的比率。
MATCH (X {label:"party time"})
OPTIONAL MATCH (X)<-[:RSVP {reply:true}]-(yes)
OPTIONAL MATCH (X)<-[:RSVP {reply:false}]-(no)
WITH LENGTH(COLLECT(DISTINCT yes)) AS yeses, LENGTH(COLLECT(DISTINCT no)) AS nos
RETURN CASE
WHEN yeses = 0 AND nos = 0 THEN "No Matches"
WHEN nos = 0 THEN "Infinity"
ELSE TOFLOAT(yeses)/nos
END;
要获得您最初要求的比率(因果与回复总数之比),查询将为:
MATCH (X {label:"party time"})
OPTIONAL MATCH (X)<-[:RSVP {reply:true}]-(yes)
OPTIONAL MATCH (X)<-[:RSVP {reply:false}]-(no)
WITH LENGTH(COLLECT(DISTINCT yes)) AS yeses, LENGTH(COLLECT(DISTINCT no)) AS nos
RETURN CASE
WHEN yeses = 0 AND nos = 0 THEN "No Matches"
ELSE TOFLOAT(yeses)/(yeses + nos)
END;