Объединить два шифровальных запроса в один запрос и один результат

#neo4j #cypher

#neo4j #шифр

Вопрос:

Я создал запрос, чтобы получить список людей в стране и некоторые средние вычисления:

 Match (people:People)-[:LOCATED_IN]->(address:Address), (people)-[:SOME]->(calc)
RETURN address.country as name, count(*) as count, avg(calc.value) as value
  

Который возвращает значения corect, например:

 name, count, value
PL  , 5    , 10
UK  , 3    , 20
US  , 6    , 30
DE  , 3    , 40
  

Чего я пытаюсь достичь, так это также получить страны людей, которых они знают, поэтому ожидаемый результат должен выглядеть, например, так:

 name, count, value, knowsAlso
PL  , 5    , 10   , UK,US
UK  , 3    , 20   , DE
US  , 6    , 30   , 
DE  , 3    , 40   , 
  

Я создал отдельный запрос для получения этой информации, передав $country:

 Match (firstPerson:Person)-[:LOCATED_IN]->(firstAddress:Address),
      (firstPerson:Person)-[:FRIEND_WITH]->(secondPerson:Person),
      (secondPerson:Person)-[:LOCATED_IN]->(secondAddress:Address)
WHERE firstAddress.country = $country
AND firstAddress.country <> secondAddress.country
RETURN DISTINCT secondAddress.country
  

но в этом сценарии мне нужно вызвать его для каждой записи в результирующем наборе из первого запроса, который, похоже, неэффективен. Есть ли способ вызвать мой второй запрос непосредственно в результирующем наборе предыдущего запроса? Или в идеале сделать эти два запроса одним запросом?

Ответ №1:

Что-то подобное может сработать для вас:

 MATCH (calc)<-[:SOME]-(p:People)-[:LOCATED_IN]->(a1:Address)
WITH a1.country AS name,
     COUNT(*) AS count,
     AVG(calc.value) AS value,
     COLLECT(DISTINCT p) AS pList
UNWIND pList AS p1
OPTIONAL MATCH (p1)-[:FRIEND_WITH]->(:Person)-[:LOCATED_IN]->(a2:Address)
WHERE name <> a2.country
RETURN name, count, value, COLLECT(DISTINCT a2.country) AS knowsAlso
  

Комментарии:

1. Привет, @cybersam. Я хочу вернуть людей с некоторыми вычислениями, расположенными по адресу (это главный приоритет), и дополнительно вернуть новый столбец, который является местоположением друга, если они у него есть. Пока я тестировал ваше решение, казалось, что оно возвращает только людей, которые соответствуют всем условиям (имеют вычисления, находятся в, и имеют друзей, находящихся в), игнорируя людей, у которых нет друзей.

2. Чего не хватало, так это слова НЕОБЯЗАТЕЛЬНЫЙ перед вторым совпадением, пожалуйста, отредактируйте свой ответ, передав НЕОБЯЗАТЕЛЬНЫЙ перед вторым СОВПАДЕНИЕМ 🙂 В любом случае принято, спасибо!