2014-06-18 2 views
1

Предположим, у меня есть простые отношения, какNeo4j: Как моделировать свойства отношений, которые являются узлами?

CREATE (a:Company { name:"Apple" })-[:BUYS]->(b:Company { name:"Beats" }) 

Теперь я хочу, чтобы собирать метаданные о :BUYS отношения - которые пользователь создал эту отношения и каковы источники, которые подтверждают это. Для этого я создаю новый узел и подключить другие узлы к нему:

MATCH (a:Company { name:"Apple" }),(b:Company { name:"Beats" }) 
CREATE a-[:IS_BUYER]->(ab:Buyout { name:"Apple-Beats" })<-[:IS_SELLER]-b 

MATCH (u:User { name:"Fred" }),(n1:Newspaper { name:"Washington Post" }), 
    (n2:Newspaper { name:"Financial Times" }),(ab:Buyout { name:"Apple-Beats" }) 
CREATE u-[:CREATED]->ab<-[:CONFIRMED_BY]-n1,ab-[:CONFIRMED_BY]->n2 

Теперь у меня есть несколько вопросов:

  1. Поскольку в большинстве случаев запросы заинтересованы только в отношениях :BUYS , я оставляю что неповрежденные и получить лучшую производительность для этих запросов, не так ли?
  2. Есть ли другие, лучшие способы моделирования этого?
  3. Что такое хороший способ создания имени/идентификатора для материализованного узла?
  4. Есть ли способ каскадировать удаление отношения :BUYS к соответствующему узлу :Buyout?

ответ

0
  1. наверняка вы можете держать :BUYS отношения. Однако сначала вы должны проверить, не следует ли отслеживать следующие (company)-[:IS_BUYER]->()<-[:IS_SELLER]-(other) относительно ваших требований. Сделайте преждевременную оптимизацию.
  2. Если отношения должны быть связаны с другой «вещью» в вашем домене, она должна быть реорганизована как узел - поэтому хороший подход к моделированию здесь.
  3. Вам не нужно устанавливать какие-либо свойства на промежуточном узле, если они не имеют смысла с точки зрения домена
  4. нет, Neo4j не имеет никакого каскадного поведения. Это необходимо реализовать на уровне приложений.
Смежные вопросы