Я готовлю базу данных графа (с использованием Neo4j), чтобы справиться с таким сценарием социальной сети:Graph - как ссылаться на узлы внутри отношений
- Пользователи могут сообщение на их стены, разделяя Сообщения с конкретными пользователями либо
- Пользователи могут отправлять сообщения другого
- Сообщения может быть либо текст или «ссылка» на сообщение
Так что я придумал следующую мысль:
пользователей и сообщения являются узлами графа. Когда пользователь A
создает сообщение P
, делящее его как с B
, так и с C
, создаются следующие отношения: A-[:posted]->p
и p-[:shared_with]->B
и p-[:shared_with]->C
. Данные Post
(id, text, date) сохраняются как свойства отношения :posted
.
Для сообщений это похоже: A-[:messaged]->C
например.
Теперь, если я хочу поделиться сообщением в сообщении, я включаю post_id
в :messaged
. Это позволяет мне тянуть все сообщения (вместе с должности связаны) с помощью одного Cypher запроса:
match (a:User) match (b) where a.username = "C" match a-[m:messaged]-b
optional match (x:User)-[p:posted]->(post:Post)
where post.id = m.post_id
return distinct
m.post_id,
startnode(m).username as from,
endnode(m).username as to ,
x.username as PostAuthor,
case x when null then "Message" else "Pulled Post" end as Type,
case x when null then m.text else post.text end as Text,
m.date
order by m.date asc
Это не смотреть прямо ко мне, хотя - так как на графике нет никакой видимой связи между Post
и сообщение. Но я не могу установить связь между узлом и связью, верно? Как мне это сделать, чтобы он был разработан правильно?
Я бы моделировать систему обмена с ACL групп и разрешениями на графиках, а не подключения каждого пользователя который является общим. Во-вторых, для системы обмена сообщениями и ссылок в теле, как правило, ссылки на сообщения представлены как URL-адреса, а не как внутренние идентификаторы –
, однако вы можете подключить сообщение с отношением «SPEAKS_ABOUT» к сообщению. Но это выглядит странно. –
Но разве это не id (post) именно для этого? ссылаться на узел из другого места? – kender