2015-05-11 12 views
34

So che ci sono domande simili in giro su Stackoverflow ma non credo che rispondano quanto segue.Database grafico vs negozi tripli - quando usare quale?

database del grafico ai miei memorizzare i dati seguenti comprensione per lo più questo schema:

Table/Collection 1: store nodes with UID 
Table/Collection 2: store relations referencing nodes via UID 

Questo permette la memorizzazione di tipi arbitrari di grafici. Ora, come ho capito i negozi triple negozio nulla, ma triple:

Triple/Collection 1: store triples (2 nodes, 1 relation) 

ora vorrei vedere la seguente distinzione per quanto riguarda i casi d'uso:

  • database del grafico: quando hai conosciuto, i collegamenti statici
  • Negozi Triple : quando i nodi sono collegati in modo approssimativo e spesso si cercano nuove connessioni

Sono confuso dal fatto che le persone non sembrano discus canta quale usare in base a questi criteri. La maggior parte degli articoli che trovo parlano di argomenti come la velocità o la compatibilità. Ma questo non è il punto più rilevante?

Mettere viceversa:

  • immaginare di avere una, definito dall'utente grafico chiaramente collegato. Perché mai vorresti immagazzinarlo solo come triple, perdendo tutte le informazioni sulle connessioni? O dover implementare alcune soluzioni personalizzate per la memorizzazione degli ID nella tripla subject.
  • Immaginate di avere i nodi raccolti in modo approssimativo che volete interrogare per relazioni sconosciute usando SPARQL. I database Graph supportano questo. Ma per questo devono costruire un altro indice presumo e sarebbero più lenti?

MODIFICA: Vedo che "perdere informazioni sulle connessioni" è il modo sbagliato di dirlo. Se fai come mostrato nella risposta accettata e inserisci più triple per 2 nodi + 1 relazione, tieni tutte le informazioni e in particolare le informazioni su quali nodi sono connessi.

+3

"tripli negozi non archiviano altro che tripli" Molti (la maggior parte?) Negozi tripli (ad esempio, per RDF) sono in realtà * quad * negozi, poiché hanno un concetto (da dataset SPARQL) di * nomi grafici *. Poiché ogni tripla esiste all'interno di un grafico, l'elemento fondamentale è in realtà ** (grafico, soggetto, predicato, oggetto) **. –

+0

"Triple/Collection 1: store triple (2 nodi, 1 relazione)" L'ordine è importante, però. Non è un vantaggio non orientato, quindi è in realtà ** (fonte, relazione, obiettivo) ** o, più comunemente, ** (soggetto, predicato (o proprietà), oggetto) **. –

+0

"Perché mai vorresti archiviarlo solo come triple, perdendo [sic] tutte le informazioni sulle connessioni?" Non sono sicuro di cosa intendi qui.La proprietà è identificata da un URI/IRI, che è universale quanto un UID, tranne per il fatto che è qualcosa che potrebbe essere più facile da ricordare, potrebbe essere deferenziabile (in modo da ottenere maggiori informazioni su di esso, ecc.) E l'oggetto e l'oggetto sono in genere URI o dati letterali. Quali informazioni sulle connessioni sono perse? –

risposta

51

La differenza principale tra i database del grafico e i negozi tripli è il modo in cui modellano il grafico. In un negozio triplo (o quad store), i dati tendono ad essere molto atomico. Ciò che intendo è che i "nodi" nel grafico tendono ad essere tipi di dati primitivi come stringa, intero, data, ecc. Le relazioni collegano insieme le primitive, e quindi "l'unità del discorso" in un triplo store è una tripla, e non un nodo o una relazione, tipicamente.

Al contrario, altri database di grafici sono spesso denominati "archivi di proprietà" perché i nodi sono contenitori di dati che corrispondono a oggetti in un dominio. Un nodo rappresenta un oggetto e ha proprietà; agiscono come tipi di dati ricchi specificati dai modellatori di grafici, più che semplici tipi di dati primitivi. In questi database di grafici, i nodi e le relazioni sono "l'unità del discorso".

Diciamo che ho una persona chiamata "Bob" che conosce "Susan".In RDF, sarebbe qualcosa di simile:

<http://example.org/person/1> :hasName "Bob". 
<http://example.org/person/1> foaf:knows <http://example.org/person/2>. 
<http://example.org/person/2> :hasName "Susan". 

In un database grafico come Neo4j, sarebbe questo:

(a:Person {name: "Bob"})-[:KNOWS]->(b:Person {name: "Susan"}) 

Si noti che in RDF, è 3 rapporti, ma solo uno di quei rapporti in realtà esprime semantica tra due entità. Le altre due relazioni sono solo proprietà di tracciamento di una singola entità di livello superiore (la persona). In neo4j, è la relazione tra due nodi, con ogni nodo che ha una proprietà. In RDF si tende ad identificare le cose tramite URI, in neo4j si tratta di un oggetto di database che ottiene automaticamente un ID di database. Questo è ciò che intendo per la differenza tra un negozio più atomico/primitivo (negozi tripli) e un grafico di proprietà più ricco.

I CDR e i negozi tripli sono in gran parte costruiti per i tipi di sfide architettoniche che si sono incontrati con il web semantico. Ad esempio, il namespace XML è integrato nell'ipotesi architettonica secondo la quale mescolerai e abbinerai l'uso di molti diversi vocabolari e spazi dei nomi. (Giusto, c'è un'ipotesi di "rete semantica"). Quindi in SPARQL e RDF vedrai in genere almeno l'uso di xsd, rdf e rdfs spazi dei nomi contemporaneamente e probabilmente anche owl, skos e molti altri. SPARQL e RDF/RDFS hanno anche molti hook e funzioni che sono esplicitamente disponibili per rendere più semplici le inferenze ontologiche. Tendi ad identificare le cose con gli URI come un modo di "namespacing i tuoi identificatori" ma anche perché alcune persone potrebbero voler de-referenziare l'URI ... di nuovo l'assunto qui è un ampio accordo di condivisione dei dati tra molte parti.

esercizi struttura di contrasto sono calettati verso diversi casi di utilizzo, come modellazione flessibile dei dati entro un modello/namespace, mapping tra oggetti e grafici per la persistenza di applicazioni aziendali, rapida evolvability, e così via. Tendi ad identificare le cose con il tuo schema (o un ID interno del database). Un numero intero a incremento automatico potrebbe non essere la migliore forma di ID per qualsiasi utente casuale sul web (e certamente non possono essere de-referenziati come gli URL) ma potrebbe non essere il primo pensiero per un'applicazione interna all'azienda.

Quindi quale è meglio? Il formato di triplo store più atomico o un grafico di proprietà avanzate? Hai bisogno di mescolare e abbinare molti vocabolari diversi in una query o in un modello di dati? Hai bisogno di creare una ontologia OWL o fare un'inferenza? Hai bisogno di serializzare un mucchio di oggetti java in memoria in un database? Hai bisogno di fare un attraversamento veloce di lunghi percorsi? Questi tipi di domande guiderebbero la tua selezione.

I grafici sono grafici, entrambi fanno grafici e quindi non credo ci siano molte differenze in termini di ciò che possono rappresentare, o come si va a pensare a un problema in "termini del grafico". Le differenze si riducono all'architettura sotto il cofano e a quali tipi di casi d'uso pensi di aver bisogno. Non ti dirò che uno è migliore dell'altro, ma scegli saggiamente.

+1

Grazie, penso che questo riassuma bene! Aggiungerò una modifica alla mia domanda iniziale per riassumere la mia conclusione. –

+3

Spiega molto sul Web Semantico, che è fantastico. Tuttavia c'è una differenza fondamentale tra RDF e neo4j (forse anche altri grafici non RDF) in quanto in RDF hai diretto i grafici. neo4j d'altra parte progettiamo sia grafici diretti che non orientati. Neo4j ha anche il concetto di pesi (anche complessi) integrati. Questa è una cosa che richiede smagliature scomode in RDF, sfortunatamente. –

+2

@TomaszPluskiewicz neo4j non ha pesi costruiti in alcun modo; anche se puoi scegliere di modellarli. Stessa situazione con RDF. Neo4j ha anche bordi diretti (senza bordi non orientati), sebbene tu possa scegliere di attraversarli come se fossero non orientati. Stessa situazione con RDF. – FrobberOfBits

Problemi correlati