Я писал запрос cypher для подсчета всех узлов с меткой, свойством или связью, которые содержат критерии, введенные пользователем. Когда я делаю этот запрос, я хочу подсчет всех узлов с уникальными именами меток (которые я выполнил). Я также хочу подсчитать все узлы, которые содержат конкретные отношения.Neo4j 2.0 Как мне рассчитать отношения в предложении CASE?
Это часть запроса, который возвращает количество всех узлов с метками: фрукты, урок, Tech и Testdata. Я оставил предложение WHERE, потому что он довольно длинный.
match (n)
return
sum(CASE when any(l IN labels(n) WHERE l='Fruit') THEN 1 ELSE 0 END) AS Fruit,
sum(CASE when any(l IN labels(n) WHERE l='Lesson') THEN 1 ELSE 0 END) AS Lesson,
sum(CASE when any(l IN labels(n) WHERE l='Tech') THEN 1 ELSE 0 END) AS Tech,
sum(CASE when any(l IN labels(n) WHERE l='TestData') THEN 1 ELSE 0 END) AS TestData
возвращает
Fruit Lesson Tech TestData
1000 20 100 50
Однако, я хотел бы также, чтобы подсчитать число узлов, которые имели определенные отношения (я знаю имена загодя), как «ЗНАЕТ», «ЯВЛЯЕТСЯ» , и "НАЗНАЧЕНИЕ". Например, если пользователь искал слово «знает», а результирующие узлы имели отношение «знает», то я бы подсчитал этот узел. Впоследствии в моем запросе сообщалось, что я нашел 20 узлов, которые были связаны через отношения «знает».
Я хотел бы сделать это, не исключая ни один из моих результирующих узлов. Заметьте, что я не включал никаких отношений в предложение match. Я все еще хочу включить узлы, у которых нет отношений (я не думаю об этом).
Кто-нибудь знает, как это сделать? Это можно сделать?
Я искал что-то похожее на это:
match (n)
return
sum(CASE when any(r IN rels(n) WHERE r='KNOWS') THEN 1 ELSE 0 END) AS KNOWS,
sum(CASE when any(r IN rels(n) WHERE r='IS_A') THEN 1 ELSE 0 END) AS IS_A,
sum(CASE when any(r IN rels(n) WHERE r='DESTINATION') THEN 1 ELSE 0 END) AS DESTINATION,
Это в основном то, что я хочу, за исключением предложения о матче. Добавляя связь в предложении match, он удаляет любые узлы, у которых нет хотя бы одного отношения. Я хочу, чтобы в результаты были включены дочерние узлы. Это то, что я имел в виду, когда я сказал «не исключая ни одного из моих результирующих узлов». Я действительно не хочу, чтобы подзапрос за один вопрос (хотя мне, возможно, придется), но я хотел бы добавить его к текущему запросу. –
Если вы хотите, чтобы все это в одном запросе с отношениями, основанными на соотношении, как дополнительные столбцы результатов для вашего первого запроса, делает 'MATCH (n) OPTIONAL MATCH (n) - [r] -() WITH n, collect (r) as rs 'и ваши оригинальные' СУММЫ 'плюс те, которые я предложил вместе, делают то, что вы хотите? Совпадающие и необязательные шаблоны совпадений будут включать узлы, которые не имеют отношений, и подсчеты должны работать. Вы можете попробовать вернуться перед всеми операциями 'SUM', чтобы убедиться, что соответствие соответствует вашим требованиям. – jjaderberg
Да, дополнительное совпадение было именно тем, что мне нужно. Я неправильно понял, как работает дополнительный матч, когда я смотрел на него раньше. Благодаря! –