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