Вернуть узел с большинством соединений с другими узлами, имеющими определенное свойство - PullRequest
1 голос
/ 26 октября 2019

В моем графике сообщений есть следующие отношения:

(m:Message)-[:ORIGINATED_AT]->(i:IP)-[:IN_NETWORK]-(n:Network)

Я пытаюсь найти IP-адреса и сети, отправляющие наибольшее количество сообщений с категорией = «спам».

Я пробовал следующий запрос:

// IPs sending the most spam:
match (ip:IpAddress)--(m:Message)
where toLower(m.category) contains 'spam'
with ip, size(()-[:ORIGINATED_AT]->(ip)) as volume
ORDER BY volume DESC LIMIT 10
match (ip)--(net:Network)
return ip, net

, но кажется, что он обнаруживает "сети, которые отправили наибольшее количество сообщений с хотя бы одним спам-сообщением", но мне нужны "сети, которые имеютотправил больше всего спама ". Кроме того, запрос возвращает меньше 10 ожидаемых результатов.

Я удалил переменную сообщения, чтобы получить IP-адреса, отправляющие наибольшее количество сообщений, и это, похоже, работает как ожидалось:

// IPs sending the most messages:
match (ip:IpAddress)
with ip, size(()-[:ORIGINATED_AT]->(ip)) as volume
ORDER BY volume DESC LIMIT 10
match (ip)--(net:Network)
return ip, net

Как я могу изменить свой запрос, чтобы правильно подсчитывать только те отношения, в которых связанный (m: Message) имеет категорию: «спам»?

1 Ответ

1 голос
/ 27 октября 2019

Я думаю, что вы на правильном пути, вы просто немного усложняете это. Вам просто нужно агрегировать счетчик для каждого сообщения, которое содержит «спам» на IP-адрес.

MATCH (ip:IpAddress)--(m:Message)
WHERE toLower(m.category) contains 'spam'
RETURN ip, count(m) AS spam_messages
ORDER BY spam_messages DESC LIMIT 10

Чтобы использовать size() в этой ситуации, замените count() другой функцией агрегирования, collect(), котораяпомещает элементы в список или коллекцию вместо их подсчета. Затем используйте size(), чтобы вернуть количество элементов в списке. Этот подход был бы полезен, если бы вам понадобились сами фактические элементы для какой-то последующей обработки.

MATCH (ip:IpAddress)--(m:Message)
WHERE toLower(m.category) contains 'spam'
WITH ip, collect(m) AS spam_messages
RETURN ip, size(spam_messages) as spam_messages_size
ORDER BY spam_messages_size DESC LIMIT 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...