#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. идеально — это почти достигнуто, но я предполагаю, что с этого я начинаю учиться — большое спасибо за вашу помощь. Не могли бы вы объяснить, как именно это работает и что делает каждый шаг, пожалуйста?