Как объединить результаты выборочного запроса в виде строки в Neo4j? - PullRequest
0 голосов
/ 22 ноября 2018

Исходная ситуация

Я написал рабочий запрос Cypher, который возвращает четыре различных значения.

MATCH
  <complex satement>
WITH
  count(DISTINCT typeA) AS amountA,
  count(DISTINCT typeB) AS amountB,
  count(DISTINCT typeC) AS amountC,
  count(DISTINCT typeD) AS amountD
RETURN
  amountA, amountB, amountC, amountD;

Целевое решение

Вместо таблицы из четырех столбцовТеперь я хочу вернуть одну текстовую строку, где все четыре величины объединены, включая описательную метку.Однако количество должно быть только частью строки, если ее количество больше нуля.

╒════════════════════════════════════════════════════╕
│"formattedQuantities"                               │
╞════════════════════════════════════════════════════╡
│"amountA: 123456, amountC: 9876543, amountD: 2018"  │
└────────────────────────────────────────────────────┘

(Так как значение valueB равно 0, в результате оно опускается.)

Я использую этот Cyper-запрос для нескольких миллионов строк.Из-за опасений, влияющих на производительность, я не хочу создавать и вызывать пользовательский плагин.

Итак, как я могу вернуть значения в виде строки с Cypher и Neo4j?Можете ли вы дать мне совет, как решить эту проблему?Заранее большое спасибо за то, что указали мне правильное направление!


подход к проблеме / предварительный результат

Cypher:

MATCH
<complex satement>
WITH
  count(DISTINCT typeA) AS amountA,
  count(DISTINCT typeB) AS amountB,
  count(DISTINCT typeC) AS amountC,
  count(DISTINCT typeD) AS amountD
WITH
  ['amountA: ', amountA, ', amountB: ', amountB, ', amountC: ', amountC, ', amountD: ', amountD] AS quantities
RETURN
  reduce(result = toString(head(quantities)), n IN tail(quantities) | result + n) AS formattedQuantities;

Результат:

╒═════════════════════════════════════════════════════════════════╕
│"formattedQuantities"                                            │
╞═════════════════════════════════════════════════════════════════╡
│"amountA: 123456: 1, amountB: 0, amountC: 9876543, amountD: 2018"│
└─────────────────────────────────────────────────────────────────┘

Все еще открыто:

  • фильтрация суммы B из-за значения 0

1 Ответ

0 голосов
/ 23 ноября 2018

Вы хотите использовать функцию FILTER

MATCH
<complex satement>
WITH
  count(DISTINCT typeA) AS amountA,
  count(DISTINCT typeB) AS amountB,
  count(DISTINCT typeC) AS amountC,
  count(DISTINCT typeD) AS amountD
// Reformat to list
WITH
  [{name:'amountA', value:amountA}, {name:'amountB', value:amountB}, {name:'amountC', value:amountC}, {name:'amountD', value:amountD}] AS quantities
// Filter out 0's
WITH filter(x IN quantities WHERE x.value > 0) AS quantities
// Convert list to string
RETURN
  reduce(result = quantities[0].name + ": " + quantities[0].value, n IN tail(quantities) | result + ", " + n.name + ": " + n.value) AS formattedQuantities; AS formattedQuantities;

Обратите внимание, что это возвращает ноль, если все значения равны 0 (нуль + строка = ноль)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...