Neo4j: найти степень связи
Я использую Neo4j, чтобы найти степень связи между пользователями. У меня есть данные в форме подписчика:
(user)-[:INTERACTS_WITH]->(user)
Таким образом, если user_1 взаимодействует с user_2, а user_2 взаимодействует с user_3, то user_1 и user_3 совместно используют соединение второй степени.
В идеале я хотел бы получить следующий набор данных, подобный этому, взамен:
degree count
NULL 123
1 1050
2 3032
3 2110
... ...
Есть ли лучший способ сделать это, чем просто запускать функцию shorttestPath() для каждой пары пользователей? Если нет, то каков наилучший способ зацикливания пользователей в Neo4j?
Кроме того, я думаю, что здесь играет роль направление, поэтому вы бы порекомендовали сделать эти отношения двунаправленными, чтобы для каждого (user1)-[:INTERACTS_WITH]->(user2)
Я бы также создал обратную связь (user2)-[:INTERACTS_WITH]->(user1)
?
Если у вас есть какие-либо советы по созданию вышеуказанного набора данных, пожалуйста, дайте мне знать.
Большое спасибо!
1 ответ
Есть ли лучший способ сделать это, чем просто запускать функцию shorttestPath() для каждой пары пользователей? Если нет, то каков наилучший способ зацикливания пользователей в Neo4j?
Я считаю что беги shortestPath()
Для каждой пары пользователей это хороший выбор, но имейте в виду, что он должен быть очень дорогим.
Кроме того, я думаю, что здесь играет роль направление, поэтому вы бы порекомендовали сделать эти отношения двунаправленными, чтобы для каждого
(user1)-[:INTERACTS_WITH]->(user2)
Я бы также создал обратную связь(user2)-[:INTERACTS_WITH]->(user1)
?
Нет, вам не нужны другие отношения. Помните, что направление отношений можно игнорировать во время запроса в Neo4j. При моделировании отношений, которые, естественно, являются двунаправленными, мы должны использовать только одно отношение для их представления. Таким образом, при запросе графа мы можем перейти от a
в b
а также b
в a
, Вам нужны только дополнительные отношения, когда некоторые данные в двунаправленных отношениях могут отличаться между a
в b
а также b
в a
, Предположим, что взаимодействие между пользователями в вашей модели имеет вес, и этот вес может отличаться от a
в b
а также b
в a
, В этом случае вы можете сохранить этот вес как свойство в отношениях. Пример:
(a)-[:INTERACTS_WITH {weight:10}]->(b)
(b)-[:INTERACTS_WITH {weight:6}]->(a)
Посмотрите в этой ссылке о моделировании двунаправленных отношений.