从与Cypher的关系中获得属性的总比率

时间:2015-01-14 22:13:53

标签: neo4j cypher

假设我有一个这样的图表(原谅伪代码):

(A)-[:RSVP {reply:true}]->(X)

(B)-[:RSVP {reply:true}]->(X)

(C)-[:RSVP {reply:false}]->(X)

如何获得积极回应的比率?我期待的结果会给我0.66的接受率。

2 个答案:

答案 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”错误)。

  1. 如果没有RSVP,则查询返回字符串“No Matches”。
  2. 如果没有false RSVP,则查询返回字符串“Infinity”。
  3. 否则,查询返回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;
    
  4. 要获得您最初要求的比率(因果与回复总数之比),查询将为:

        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;