Подзапрос Neo4J над тем же свойством для вычисления коэффициента

#neo4j #cypher

#neo4j #cypher

Вопрос:

Я работаю с графиком твитов. Я пытаюсь получить соотношение между твитами на испанском и твитами на английском.

При проверке количества твитов по языку:

 MATCH (twtEs:Tweet)<-[:HAS_WRITEN]-()-[:HAS_AS_PROFILE_LANGUAGE]->(l:Language)
RETURN DISTINCT l.languageCode, count(*)
\ Result:
╒════════════════╤══════════╕
│"l.languageCode"│"count(*)"│
╞════════════════╪══════════╡
│"en"            │165392    │
├────────────────┼──────────┤
│"es"            │73693     │
└────────────────┴──────────┘
 

Мы можем видеть количество для каждого языка.

Но при попытке вычислить коэффициент напрямую:

 MATCH (twtEs:Tweet)<-[:HAS_WRITEN]-()-[:HAS_AS_PROFILE_LANGUAGE]->(:Language{languageCode:'es'})
WITH count(twtEs) AS tweetsEs 
MATCH (twtEn:Tweet)<-[:HAS_WRITEN]-()-[:HAS_AS_PROFILE_LANGUAGE]->(:Language{languageCode:'en'})
WITH count(twtEn) as tweetsEn, tweetsEs
RETURN tweetsEs/tweetsEn as RatioTweetsEsvsEn;
\ Result:
╒═══════════════════╕
│"RatioTweetsEsvsEn"│
╞═══════════════════╡
│0                  │
└───────────────────┘
 

Вот что я получаю, когда оно должно быть 0,44557.
Я проверял документацию и другие ответы в Stackoverflow, но не нашел ничего похожего для использования в качестве примера. Вероятно, второй запрос неверен, но я изо всех сил пытаюсь его разрешить.

Заранее спасибо.

Я запускаю:

  • Версия браузера Neo4j: 3.2.20
  • Версия сервера Neo4j: 3.5.8 (сообщество)

Ответ №1:

Это потому, что значения count являются целыми числами.

Например :

 WITH 165392 AS v1, 73693 AS v2
RETURN v1/v2

╒═══════╕
│"v1/v2"│
╞═══════╡
│2      │
└───────┘
 

Вместо этого вы можете преобразовать их в значения с плавающей запятой :

 WITH 165392 AS v1, 73693 AS v2
RETURN v1*1.0f/v2*1.0f

╒══════════════════╕
│"v1*1.0f/v2*1.0f" │
╞══════════════════╡
│2.2443379968246644│
└──────────────────┘
 

Что даст вам :

 MATCH (twtEs:Tweet)<-[:HAS_WRITEN]-()-[:HAS_AS_PROFILE_LANGUAGE]->(:Language{languageCode:'es'})
WITH count(twtEs) AS tweetsEs 
MATCH (twtEn:Tweet)<-[:HAS_WRITEN]-()-[:HAS_AS_PROFILE_LANGUAGE]->(:Language{languageCode:'en'})
WITH count(twtEn) as tweetsEn, tweetsEs
RETURN tweetsEs*1.0f/tweetsEn*1.0f as RatioTweetsEsvsEn;