Находить, группировать и подсчитывать отношения в Neo4J с помощью cypher

#neo4j #cypher

#neo4j #cypher

Вопрос:

Привет, у меня есть 2 набора меток в neo4j 3.03:-

 INTERACTIONS

uidpid  100000060085836_170782808933_10154454374183934
name    Dean Hohaia
postid  170782808933_10154454374183934
pageid  170782808933
userid  100000060085836

POSTS

shares      0
comments    0
postid      100129044360_100138063361365
pageid      100129044360
type        link
createdtime 2010-03-30 00:43:23
pagename    Study in New Zealand
likes       4
  

У меня есть отношения под названием LIKES, которые были созданы, подобные этому:-

 MATCH (i:interactions),(p:posts)
WHERE i.userid = p.userid
CREATE (i)-[:likes]->(p)
  

которые выглядят следующим образом:

 uidpid  613637235481924_125251397514429_1000501533322740
name    Toth Mariann
postid  125251397514429_1000501533322740
pageid  125251397514429
userid  613637235481924
  

в основном то же, что и взаимодействия.

Мне нужно найти способ создать запрос, который показывает:-

для каждого имени страницы в сообщениях показывать количество взаимодействий с идентификаторами пользователей по имени страницы:-

 Source Pagename  Matched Pagename   Userids count #
Air New Zealand  Rialto Channel     12494
Air New Zealand  RNZ                2979
Air New Zealand  SKY TV             4651
  

По сути — для каждого имени страницы в сообщениях покажите количество всех других страниц, с которыми взаимодействовал каждый пользователь.

Нужно ли мне создавать какие-либо другие взаимосвязи для достижения этого?

Вот точные данные примера, которые я использую в формате CSV https://www.wetransfer.com/downloads/37e89c65f029344a2205ca717f04b6fe20161024051807/0d4ab3

Ответ №1:

Во-первых, как вы упомянули, мы связываем взаимодействия и публикации на основе postid (1).

 MATCH (i:interactions), (p:posts)
WHERE i.postid = p.postid
CREATE (i)-[:likes]->(p)
  

Затем мы создаем узел для каждого пользователя (2):

 MATCH (i:interactions)
WITH DISTINCT i.userid AS userid
CREATE (u:user {userid: userid})
  

И подключать их к взаимодействиям (3):

 MATCH (u:user), (i:interactions)
WHERE u.userid = i.userid
CREATE (u)-[:performed]->(i)
  

Можно выполнить эти две CREATE операции (2 и 3) с помощью одной MERGE , но производительность, похоже, намного хуже — не уверен, почему.

 MATCH (i:interactions)
MERGE (u:users {userid: i.userid})-[:performed]->(i)
  

Создав отношения likes и performed , теперь мы можем сформулировать запрос следующим образом (4):

 MATCH (source:posts)<-[:likes]-(:interactions)<-[:performed]-(:users)-[:performed]->(:interactions)-[:likes]->(matched:posts)
RETURN source.pagename, matched.pagename, COUNT(matched)
LIMIT 10
  

Предупреждение: для запуска на моем ноутбуке (четырехъядерный процессор i7 конца 2011 года SSD-накопитель) потребовалось две минуты.

Запрос начинается с post ( source ) и переходит по likes и performed ребрам к каждому пользователю, который выполнял взаимодействие. Затем он переходит к другим взаимодействиям этих пользователей (опять же, через likes и performed ребра), которые заканчиваются узлом, представляющим post ( matched ). Количество matched узлов агрегируется с помощью COUNT метода и возвращается вместе со свойствами pagename.

Соответствующее предложение: названия меток должны начинаться с заглавной буквы и быть в единственном числе, т.е. Post , Interaction и User .

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

1. Привет @szarnyasg — вот ссылка на данные, ваш пример сработал, но не с моими данными. Спасибо за попытку — любая помощь была бы высоко оценена wetransfer.com/downloads /…

2. Мне удалось импортировать данные в пустую базу данных с помощью этого (осторожно — он загружается в graph.db ) bin/neo4j-import --into data/databases/graph.db --id-type string --nodes:interactions import/neo_ilab_people.csv --nodes:posts import/neo_posts.csv . Однако userid в сообщениях: head -n 1 import/neo_posts.csv отображается: "pageid","pagename","postid","type","createdtime","likes","comments","shares" нет. Это будет использоваться запросом, который создает likes отношения.

3. Спасибо @szarnyasg, взаимосвязь между сообщениями и взаимодействиями осуществляется через postid. Итак, запрос, который я ищу (отправленный вам в сообщении linkedin), — это получить количество всех идентификаторов пользователей для страницы (air New Zealand) И список всех других страниц, с которыми взаимодействовали эти идентификаторы пользователей — имеет ли это смысл?

4. Я изменил отношение (мое плохое) на postid = postid, как вы сделали, но я не могу заставить запрос работать с данными в wetransfer 🙁

5. идеально — это почти достигнуто, но я предполагаю, что с этого я начинаю учиться — большое спасибо за вашу помощь. Не могли бы вы объяснить, как именно это работает и что делает каждый шаг, пожалуйста?