Le risorse RDF possono essere recuperate usando il servizio RDF.
Sono identificate da un URI. Non puoi usare direttamente una stringa,
devi ottenere un oggetto risorsa usando il servizio RDF. Le datasource
contengono riferimenti a queste risorse. Come accade per le datasource,
il servizio RDF ha una funzione per mettere in memoria gli oggetti
risorsa. Quando viene fatta una richiesta per una risorsa che è
già in cache, verrà ritornata la versione nella cache.
Perciò ogni riferimento alla risorsa avrà lo stesso
effetto. In codice nativo, ogni riferimento avrà lo stesso
puntatore, così che possano essere comparate senza dover fare un
più complicato confronto di stringhe di testo.
Dato che la risorsa è nella cache, è globalmente unica. Se diverse datasource si riferiscono alla stessa risorsa, si riferiranno comunque alla stessa cosa. Questo rende facile la combinazione di diverse datasource in una sola datasource composita e avere i dati di tutte le datasource come se fossero mischiati insieme.
Gli oggetti risorsa implementano l'interfaccia nsIRDFResource.
Non implementare mai le tue risorse in Javascript, usa sempre il
servizio RDF per recuperarle. Altrimenti, il cambio e manutenzione
delle risorse non funzionerà in maniera corretta. Per fortuna,
non c'è ragione di implementare i tuoi oggetti risorsa, visto
che l'implementazione standard va bene per la maggior parte degli scopi.
Una risorsa può essere recuperata dal servizio RDF utilizzando il metodo GetResource. A questo metodo dovrebbe essere passato l'URI della risorsa e ritornerà un oggetto risorsa corrispondente a quell'URI. Per esempio:
var res = rdfService.GetResource("http://www.xulplanet.com/rdf/people/Karen");
I nodi anonimi sono quelli che non hanno un URI, e sono spesso usati come segnaposto nel grafico RDF. Mozilla mantiene i nodi vuoti (nodi anonimi) assegnandogli un URI generato a caso. Questo significa che le risorse anonime sono mantenute nello stesso modo delle altre risorse, eccetto che sono generati URI casuali. Anche se non dovresti usare direttamente gli URI di risorsa, cominciano sempre con la stringa 'rdf:#$' seguita da numeri e lettere casuali. Il metodo GetAnonymousResource del servizio RDF può essere usato per recuperare risorse anonime. Non ha bisogno di un URI come argomento, dal momento che (l'URI) verrà generato.
var res = rdfService.GetAnonymousResource();
Quando viene chiamato il metodo GetResource, il servizio RDF guarderà nella cache per vedere se la risorsa è già in cache. Se c'è, verrà ritornata la risorsa in cache. Se la risorsa non è in cache, il servizio RDF creerà un nuovo oggetto risorsa e lo ritornerà. Alla stessa maniera in cui il servizio RDF gestisce le datasource, le risorse non sono messe direttamente in cache dal servizio RDF. Queto viene fatto nel metodo Init della risorsa, che può essere chiamato prima che il metodo GetResource ritorni.
La risorsa chiamerà il metodo RegisterResource del servizio RDF per mettere la risorsa in cache. Quando viene rilasciato l'ultimo riferimento alla risorsa, l'oggetto risorsa sarà cancellato e la risorsa chiamerà il metodo UnregisterResource del servizio RDF per rimuovere la risorsa dalla cache.
Quando il servizio crea una nuova risorsa, trova un oggetto costruttore (factory) in grado di creare la risorsa. Il costruttore è incaricato dell'allocazione della risorsa. Nella maggior parte dei casi, sarà usato il costruttore standard, che crea oggetti risorsa standard. E' possibile ottenere che un diverso costruttore crei le risorse, se ci fosse bisogno per qualche elaborazione particolare. Il costruttore verrà modellato usando lo schema dell'URI della risorsa. Per esempio se l'URI della risorsa fosse 'http://www.example.com/resource/' lo schema dell'uri sarebbe 'http', così sarebbe usato un costruttore in grado di generare risorse 'http'. Nota che questo non ha niente a che fare con i siti web HTTP. Se l'URI fosse 'urn:example', sarebbe usato un costruttore 'urn'.
Questo meccanismo permette a un componente nativo personalizzato di
avere una diversa implementazione della risorsa. Il servizio RDF
cercherà un componente nella forma @mozilla.org/rdf/resource-factory;1?name=<schema>
dove <schema> è lo schema dell'URL. Questo componente
sarà usato per creare gli oggetti risorsa. Questa funzione
è usata dall'applicazione mail di Mozilla per creare risorse
specializzate. Comunque, questa capcità non è
particolarmente necessaria per scopi generali e dovrebbe essere
evitata. Nella maggior parte dei casi, non verrà trovato un
costruttore e verrà creata una risorsa predefinita.
Una volta ottenuto un oggetto risorsa, puoi ottenere il suo URI richiamando la sua proprietà Value. Non puoi cambiare l'URI con questa proprietà, devi ottenere un oggetto risorsa usando il metodo GetResource del servizio RDF. Ecco un esempio che richiama una risorsa e mostra il suo URI:
var res = rdfService.GetResource("http://www.xulplanet.com/rdf/people/Sandra");
alert(res.Value);
Mozilla gestisce i letterali RDF in una maniera simile. Dovrebbero essere ritornati usando il servizio RDF e sono messi in cache in modo tale che lo stesso oggetto è ritornato ogni volta che viene richiesto un letterale. I letterali sono identificato dal contenuto della loro stringa. Non puoi creare tipi personalizzati di letterali e recuperarli tramite il servizio RDF.
Mozilla supporta un numero di diversi tipi di letterali, principalmente per convenienza. I tipi sono riassunti sotto:
| Tipo | Interfaccia XPCOM |
Metodo del servizio RDF |
Descrizione |
|---|---|---|---|
| String | nsIRDFLiteral | GetLiteral | Stringa di qualunque lunghezza |
| Integer | nsIRDFInt | GetIntLiteral | Intero a 32 bit |
| Date | nsIRDFDate | GetDateLiteral | Una data/ora inizializzata usando un numero a 64 bit di microsecondi dal 1 gennaio 1970 GMT. |
| Blob | nsIRDFBlob | GetBlobLiteral | Ogni tipo di dati binari. Questo tipo non può essere inserito in uno script. |
Nella tabella viene mostrato anche il metodo del servizio RDF che si dovrebbe chiamare per recuperare un letterale del tipo desiderato. Tutti i tipi di letterali sono messi in cache, il che significa che ogni richiesta di ottenere il letterale intero '7' ritorneranno lo stesso oggetto.
Per esempio, per ritornare un letterale stringa, si può usare:
var house = rdfService.GetLiteral("House");
Nei files RDF/XML puoi usare un attributo extra per indicare che
tipo di letterale usare. Nelle nuove specifiche proposte per RDF, si
userebbe l'attributo rdf:dadatype per
indicare il tipo di un letterale. Il parser RDF di Mozilla non
implementa ancora questo, perché è stato scritto molto
tempo prima che le nuove specifiche venissero definite, ma è
disponibile un modo simile. Il tipo è indicato aggiungendo
l'attributo NC:parseType a un letterale. Lo spazio di nomi 'NC' è 'http://home.netscape.com/NC-rdf#'. Ecco un esempio:
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:NC="http://home.netscape.com/NC-rdf#">
xmlns:sample="http://www.xulplanet.com/rdf/example/">
<rdf:Description rdf:about="urn:person:Sandra">
<sample:name NC:parseType="Integer">Sandra</sample:name>
</rdf:Description>
</rdf:RDF>
Come per le risorse, i letterali hanno anche una proprietà Value che può essere usate per ottenere il valore di un letterale.
Tutte le risorse RDF implementano l'interfaccia nsIRDFResource e tutti i letterali implementano una delle interfacce elencate nella tabella sopra. Tutte le interfacce letterale e risorsa sono sottointerfacce dell'interfaccia più generale nsIRDFNode. Questa interfaccia rappresenta un nodo nel grafico RDF ed è disponibile per tutte le risorse e i letterali. I metodi di ricerca di una datasource che possono ritornare o una risorsa o un letterale ritorneranno un nodo e potrai usare QueryInterface per trasformare un nodo in un tipo più specifico. I metodi di ricerca che possono solo ritornare una risorsa ritornerebbero direttamente nsIRDFResource.
L'interfaccia nsIRDFNode ha un unico metodo, EqualsNode che può essere usato per comparare due nodi senza doverne cambiare il tipo. Questo metodo ritornerà true se i due nodi sono uguali e hanno lo stesso valore per il tipo.
RDF delegates are a way in which to attach an object to an RDF resource which will automatically be kept until the resource is no longer being used. When the resource is deleted, the delegate is released and may be deleted afterwards, assuming it isn't being used by something else. You probably wouldn't use delegates for your own purposes, so they are described only briefly below.