2015-07-01 5 views
1

Я готовлю базу данных графа (с использованием 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 и сообщение. Но я не могу установить связь между узлом и связью, верно? Как мне это сделать, чтобы он был разработан правильно?

+2

Я бы моделировать систему обмена с ACL групп и разрешениями на графиках, а не подключения каждого пользователя который является общим. Во-вторых, для системы обмена сообщениями и ссылок в теле, как правило, ссылки на сообщения представлены как URL-адреса, а не как внутренние идентификаторы –

+0

, однако вы можете подключить сообщение с отношением «SPEAKS_ABOUT» к сообщению. Но это выглядит странно. –

+0

Но разве это не id (post) именно для этого? ссылаться на узел из другого места? – kender

ответ

1

В модели, когда сообщение и сообщения как узел, ваш запрос будет выглядеть следующим образом:

match (a:User)<-[:FROM]-(m:Message)-[:TO]->(b:User) 
where a.username = "C" 
match (m)<-[:COMMENT]-(post:Post)<-[:POSTED]-(x:User) 
return distinct 
    m.id,a as from, b 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 
Смежные вопросы