In un database grafico, come faccio a sapere se utilizzare un nodo, una proprietà nodo o una proprietà di relazione?

3

Ad esempio, dati i tipi di nodo User e Post , ed esprimendo che un utente ha postato qualcosa su Twitter, quali fattori dovrei considerare nel decidere tra:

(u:User)-[posted]->(p:Post {platform: 'twitter'}) ,

(u:User)-[posted {platform: 'Twitter'}]->(p:Post)

e

(u:User)-[posted]->(p:Post)-[postedOn]->(twitter:Platform)

Sembra che ogni approccio sia valido ma probabilmente ottimale in circostanze diverse.

In particolare, sto usando Neo4j in questo caso.

    
posta Dan Ellis 11.03.2018 - 03:20
fonte

2 risposte

1

Alcune cose a cui pensare sono ciò che è il tuo caso d'uso e quali saranno le query più probabili. A seconda del tuo grafico, e non so specificatamente su neo4j, gli attributi su nodi e spigoli possono creare molta duplicazione dei dati se ogni nodo o spigolo memorizza una copia dello stesso attributo.

Se si collega a un nodo come il terzo esempio, è possibile salvare la duplicazione dei dati, ma è necessario memorizzare più spigoli.

Se frequenti spesso le query su dove è stato pubblicato qualcosa, un attributo potrebbe risultare più performante rispetto al dover attraversare un altro bordo.

Dipende anche da come stai accedendo ai dati: tramite un micro servizio o in modalità incorporata per neo4j, o se qualche altro modello di grafico è forse in memoria?

Come esempio del mio lavoro: sto rielaborando un modello di grafico che abbiamo, lo usiamo sia in memoria che tramite un micro servizio per diversi casi d'uso. Alcuni test approfonditi ci hanno infine portato a disporre di due diverse implementazioni per gli stessi dati. La copia in memoria è stata appositamente progettata per fornire query rapide sui tipi di query più comuni per quel caso d'uso e il modello di servizio micro, contenente gli stessi dati che lo memorizzano per query più efficienti sui suoi tipi di query più comuni.

    
risposta data 11.03.2018 - 04:42
fonte
0

Penso che sia importante costruire un modello di dati che catturi la comprensione del dominio aziendale. I nodi e i bordi fluiranno naturalmente da quello. Questo riguarda anche l'ontologia.

Se costruisco una sequenza di parole, e la mando su Twitter, e poi mando le stesse parole su Facebook, ho creato due distinti POST o un POST su due piattaforme? Quale di queste definizioni è importante nel dominio del problema dell'applicazione.

Per una campagna di marketing, ad esempio, potrei capire che si tratterebbe di un singolo messaggio su più piattaforme. In alternativa, se stavo valutando l'uso dei social media da parte di un individuo, posso considerarli distinti. Il contesto è tutto.

Se i post sono distinti per piattaforma, la piattaforma è un attributo di post. Se lo vedono come un singolo post, ma è l'atto di distribuzione che distingue allora la piattaforma è un attributo della relazione. Se la comunità di utenti avesse un interesse costante in Twitter e da sola, non solo come obiettivo di post, anche Twitter dovrebbe essere un nodo. Tutti e tre possono essere significativi indipendentemente e abbiamo bisogno di una nuova etichetta di nodo "postare" con i bordi per l'utente, il post e la piattaforma.

L'implementazione di un modello di dati logici come database fisico può spesso implicare compromessi. Penso che ce ne possa essere uno qui. Neo4j memorizza un elenco di bordi in entrata e in uscita su ciascun nodo. Se ci sono molti post, per esempio, su Twitter, l'aggiornamento dell'elenco dei bordi diventerà un collo di bottiglia.

    
risposta data 29.12.2018 - 13:24
fonte

Leggi altre domande sui tag