2015-01-14 2 views
0

Скажем, у меня есть график, как это (простите за псевдо-код):Получение совокупного коэффициента от собственности от отношений с Cypher

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

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

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

Как получить соотношение положительных ответов? Я ожидаю результата, который даст мне коэффициент приемки 0,66.

ответ

1

Используя данные примера @FrobberOfBits, более общий запрос, который касается нескольких частных случаев (что в противном случае заставило бы Cypher иметь ошибку «/ by zero»).

  1. Если нет RSVP, запрос возвращает строку «Нет совпадений».
  2. Если нет false RSVPs, запрос возвращает строку «Бесконечность».
  3. В противном случае запрос возвращает отношение yes к 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; 
+0

Да, это более надежный, но очень похожая версия запроса. Я писал быстро и предположил, что OP не будет задавать вопрос, когда не было ответа (указав краевой случай, когда вы получите некоторый ответ NaN) – FrobberOfBits

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); 

Затем с этим запросом, мы можем просто посчитать «да» и «нет в» отдельно, и создать отношения с простым делением:

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)

Смежные вопросы