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)

Посмотрите в этой ссылке о моделировании двунаправленных отношений.

Другие вопросы по тегам