Perpustakaan N3.JS adalah implementasi spesifikasi tingkat rendah RDF.js yang memungkinkan Anda menangani RDF di JavaScript dengan mudah. Itu menawarkan:
Parsing dan menulis adalah:
Untuk Node.js, N3.js hadir sebagai paket NPM.
$ npm install n3
const N3 = require ( 'n3' ) ;
N3.JS dengan mulus bekerja di browser melalui Webpack atau Browserify. Jika Anda tidak terbiasa dengan alat -alat ini, Anda dapat membaca Webpack: Membuat Bundel - Memulai atau Pengantar Browserify . Anda perlu membuat "Bundel UMD" dan menyediakan nama (misalnya dengan opsi -s N3
di Browserify).
Anda juga dapat memuatnya melalui CDN:
< script src =" https://unpkg.com/n3/browser/n3.min.js " > </ script >
N3.js mengikuti spesifikasi tingkat rendah RDF.js.
N3.DataFactory
akan memberi Anda fungsi pabrik untuk membuat tiga kali lipat dan paha depan:
const { DataFactory } = N3 ;
const { namedNode , literal , defaultGraph , quad } = DataFactory ;
const myQuad = quad (
namedNode ( 'https://ruben.verborgh.org/profile/#me' ) , // Subject
namedNode ( 'http://xmlns.com/foaf/0.1/givenName' ) , // Predicate
literal ( 'Ruben' , 'en' ) , // Object
defaultGraph ( ) , // Graph
) ;
console . log ( myQuad . termType ) ; // Quad
console . log ( myQuad . value ) ; // ''
console . log ( myQuad . subject . value ) ; // https://ruben.verborgh.org/profile/#me
console . log ( myQuad . object . value ) ; // Ruben
console . log ( myQuad . object . datatype . value ) ; // http://www.w3.org/1999/02/22-rdf-syntax-ns#langString
console . log ( myQuad . object . language ) ; // en
Dalam sisa dokumen ini, kami akan memperlakukan "tiga kali lipat" dan "paha depan" secara setara: kami mengasumsikan bahwa quad hanyalah triple dalam grafik bernama atau default.
N3.Parser
mentransformasikan kura-kura, trig, n-triple, atau dokumen n-quads menjadi paha depan melalui panggilan balik:
const tomAndJerry = `PREFIX c: <http://example.org/cartoons#>
# Tom is a cat
c:Tom a c:Cat.
c:Jerry a c:Mouse;
c:smarterThan c:Tom.`
const parser = new N3 . Parser ( ) ;
parser . parse ( tomAndJerry ,
( error , quad , prefixes ) => {
if ( quad )
console . log ( quad ) ;
else
console . log ( "# That's all, folks!" , prefixes ) ;
} ) ;
Argumen pertama callback adalah nilai kesalahan opsional, yang kedua adalah quad. Jika tidak ada lagi paha depan, panggilan balik dipanggil untuk terakhir kalinya dengan null
untuk quad
dan hash awalan sebagai argumen ketiga.
Atau, suatu objek dapat disediakan, di mana onQuad
, onPrefix
dan onComment
digunakan untuk mendengarkan quads
, prefixes
dan comments
sebagai berikut:
const parser = new N3 . Parser ( ) ;
parser . parse ( tomAndJerry , {
// onQuad (required) accepts a listener of type (quad: RDF.Quad) => void
onQuad : ( err , quad ) => { console . log ( quad ) ; } ,
// onPrefix (optional) accepts a listener of type (prefix: string, iri: NamedNode) => void
onPrefix : ( prefix , iri ) => { console . log ( prefix , 'expands to' , iri . value ) ; } ,
// onComment (optional) accepts a listener of type (comment: string) => void
onComment : ( comment ) => { console . log ( '#' , comment ) ; } ,
} ) ;
Jika tidak ada panggilan balik yang disediakan, parsing terjadi secara sinkron mengembalikan array paha:
const parser = new N3 . Parser ( ) ;
// An array of resultant Quads
const quadArray = parser . parse ( tomAndJerry ) ;
Secara default, N3.Parser
mem-parsing superset permisif dari kura-kura, trig, n-triple, dan n-quads.
Untuk kompatibilitas yang ketat dengan salah satu bahasa tersebut, lulus argumen format
tentang penciptaan:
const parser1 = new N3 . Parser ( { format : 'N-Triples' } ) ;
const parser2 = new N3 . Parser ( { format : 'application/trig' } ) ;
Notation3 (n3) hanya didukung melalui argumen format
:
const parser3 = new N3 . Parser ( { format : 'N3' } ) ;
const parser4 = new N3 . Parser ( { format : 'Notation3' } ) ;
const parser5 = new N3 . Parser ( { format : 'text/n3' } ) ;
Dimungkinkan untuk memberikan IRI dasar dari dokumen yang ingin Anda parse. Ini dilakukan dengan meloloskan argumen baseIRI
tentang penciptaan:
const parser = new N3 . Parser ( { baseIRI : 'http://example.org/' } ) ;
Secara default, N3.Parser
akan mengawali label simpul kosong dengan b{digit}_
awalan. Ini dilakukan untuk mencegah tabrakan node kosong yang tidak terkait memiliki label yang identik. Argumen konstruktor blankNodePrefix
dapat digunakan untuk memodifikasi awalan atau, jika diatur ke string kosong, benar -benar nonaktifkan awalan:
const parser = new N3 . Parser ( { blankNodePrefix : '' } ) ;
N3.Parser
dapat mengurai aliran Node.js saat mereka tumbuh, mengembalikan paha depan segera setelah siap.
const parser = new N3 . Parser ( ) ,
rdfStream = fs . createReadStream ( 'cartoons.ttl' ) ;
parser . parse ( rdfStream , console . log ) ;
N3.StreamParser
adalah aliran Node.js dan implementasi wastafel rdf.js. Solusi ini sangat ideal jika konsumen Anda lebih lambat, karena data sumber hanya dibaca ketika konsumen siap.
const streamParser = new N3 . StreamParser ( ) ,
rdfStream = fs . createReadStream ( 'cartoons.ttl' ) ;
rdfStream . pipe ( streamParser ) ;
streamParser . pipe ( new SlowConsumer ( ) ) ;
function SlowConsumer ( ) {
const writer = new require ( 'stream' ) . Writable ( { objectMode : true } ) ;
writer . _write = ( quad , encoding , done ) => {
console . log ( quad ) ;
setTimeout ( done , 1000 ) ;
} ;
return writer ;
}
Acara prefix
khusus menandakan setiap awalan dengan prefix
dan argumen term
. Acara comment
khusus dapat diaktifkan dengan mengatur comments: true
di konstruktor N3.Streamparser.
N3.Writer
Serializes Quads sebagai Dokumen RDF. Tulis paha depan melalui addQuad
.
const writer = new N3 . Writer ( { prefixes : { c : 'http://example.org/cartoons#' } } ) ; // Create a writer which uses `c` as a prefix for the namespace `http://example.org/cartoons#`
writer . addQuad ( quad (
namedNode ( 'http://example.org/cartoons#Tom' ) , // Subject
namedNode ( 'http://example.org/cartoons#name' ) , // Predicate
literal ( 'Tom' ) // Object
) ) ;
writer . end ( ( error , result ) => console . log ( result ) ) ;
Secara default, N3.Writer
menulis kura -kura (atau trig jika beberapa paha depan berada dalam grafik bernama).
Untuk menulis n-triple (atau n-quads) sebagai gantinya, lulus argumen format
setelah penciptaan:
const writer1 = new N3 . Writer ( { format : 'N-Triples' } ) ;
const writer2 = new N3 . Writer ( { format : 'application/trig' } ) ;
N3.Writer
juga dapat menulis paha depan ke aliran Node.js melalui addQuad
.
const writer = new N3 . Writer ( process . stdout , { end : false , prefixes : { c : 'http://example.org/cartoons#' } } ) ;
writer . addQuad (
namedNode ( 'http://example.org/cartoons#Tom' ) , // Subject
namedNode ( 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' ) , // Predicate
namedNode ( 'http://example.org/cartoons#Cat' ) // Object
) ;
writer . addQuad ( quad (
namedNode ( 'http://example.org/cartoons#Tom' ) , // Subject
namedNode ( 'http://example.org/cartoons#name' ) , // Predicate
literal ( 'Tom' ) // Object
) ) ;
writer . end ( ) ;
N3.StreamWriter
adalah aliran Node.js dan implementasi wastafel RDF.js.
const streamParser = new N3 . StreamParser ( ) ,
inputStream = fs . createReadStream ( 'cartoons.ttl' ) ,
streamWriter = new N3 . StreamWriter ( { prefixes : { c : 'http://example.org/cartoons#' } } ) ;
inputStream . pipe ( streamParser ) ;
streamParser . pipe ( streamWriter ) ;
streamWriter . pipe ( process . stdout ) ;
Anda mungkin ingin menggunakan notasi […]
dan daftar (…)
tentang kura -kura dan trig. Namun, seorang penulis streaming tidak dapat membuat ini secara otomatis: notasi steno hanya mungkin jika node kosong atau daftar kepala tidak digunakan nanti, yang hanya dapat ditentukan secara meyakinkan di akhir aliran.
Fungsi blank
dan list
memungkinkan Anda untuk membuatnya secara manual sebagai gantinya:
const writer = new N3 . Writer ( { prefixes : { c : 'http://example.org/cartoons#' ,
foaf : 'http://xmlns.com/foaf/0.1/' } } ) ;
writer . addQuad (
writer . blank (
namedNode ( 'http://xmlns.com/foaf/0.1/givenName' ) ,
literal ( 'Tom' , 'en' ) ) ,
namedNode ( 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' ) ,
namedNode ( 'http://example.org/cartoons#Cat' )
) ;
writer . addQuad ( quad (
namedNode ( 'http://example.org/cartoons#Jerry' ) ,
namedNode ( 'http://xmlns.com/foaf/0.1/knows' ) ,
writer . blank ( [ {
predicate : namedNode ( 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' ) ,
object : namedNode ( 'http://example.org/cartoons#Cat' ) ,
} , {
predicate : namedNode ( 'http://xmlns.com/foaf/0.1/givenName' ) ,
object : literal ( 'Tom' , 'en' ) ,
} ] )
) ) ;
writer . addQuad (
namedNode ( 'http://example.org/cartoons#Mammy' ) ,
namedNode ( 'http://example.org/cartoons#hasPets' ) ,
writer . list ( [
namedNode ( 'http://example.org/cartoons#Tom' ) ,
namedNode ( 'http://example.org/cartoons#Jerry' ) ,
] )
) ;
writer . end ( ( error , result ) => console . log ( result ) ) ;
N3.Store
memungkinkan Anda untuk menyimpan tiga kali lipat dalam memori dan menemukannya dengan cepat.
Dalam contoh ini, kami membuat toko baru dan menambahkan tiga kali lipat :Pluto a :Dog.
dan :Mickey a :Mouse
.
Kemudian, kami menemukan tiga kali lipat dengan :Mickey
sebagai subjek.
const store = new N3 . Store ( ) ;
store . add (
quad (
namedNode ( 'http://ex.org/Pluto' ) ,
namedNode ( 'http://ex.org/type' ) ,
namedNode ( 'http://ex.org/Dog' )
)
) ;
store . add (
quad (
namedNode ( 'http://ex.org/Mickey' ) ,
namedNode ( 'http://ex.org/type' ) ,
namedNode ( 'http://ex.org/Mouse' )
)
) ;
// Retrieve all quads
for ( const quad of store )
console . log ( quad ) ;
// Retrieve Mickey's quads
for ( const quad of store . match ( namedNode ( 'http://ex.org/Mickey' ) , null , null ) )
console . log ( quad ) ;
Jika Anda menggunakan beberapa toko, Anda dapat mengurangi konsumsi memori dengan memungkinkan mereka untuk berbagi indeks entitas:
const entityIndex = new N3 . EntityIndex ( ) ;
const store1 = new N3 . Store ( [ ] , { entityIndex } ) ;
const store2 = new N3 . Store ( [ ] , { entityIndex } ) ;
Dataset
Toko ini mematuhi antarmuka Dataset
yang memperlihatkan properti berikut
Atribut:
size
-Integer non-negatif yang menentukan jumlah paha depan dalam set.Metode:
add
- Tambahkan quad yang ditentukan ke dataset. Paha depan yang ada, sebagaimana didefinisikan dalam Quad.equals
, akan diabaikan.delete
- Menghapus quad yang ditentukan dari dataset.has
- menentukan apakah dataset menyertakan quad tertentu.match
- Mengembalikan dataset baru yang terdiri dari semua paha depan dalam contoh saat ini yang cocok dengan argumen yang diberikan.[Symbol.iterator]
- Mengimplementasikan protokol iterator untuk memungkinkan iterasi di semua quads
dalam dataset seperti pada contoh di atas. Toko mengimplementasikan metode manipulasi berikut selain antarmuka Dataset
standar (dokumentasi):
addQuad
untuk memasukkan satu quadaddQuads
untuk memasukkan array paharemoveQuad
untuk menghapus satu quadremoveQuads
untuk menghapus array paharemove
untuk menghapus aliran paha depanremoveMatches
untuk menghapus semua paha depan yang cocok dengan pola yang diberikandeleteGraph
untuk menghapus semua paha depan dengan grafik yang diberikancreateBlankNode
Mengembalikan pengidentifikasi simpul kosong yang tidak digunakanToko menyediakan metode pencarian berikut (dokumentasi):
match
mengembalikan aliran dan generator paha depan yang cocok dengan pola yang diberikangetQuads
mengembalikan serangkaian paha depan yang cocok dengan pola yang diberikancountQuads
menghitung jumlah paha depan yang cocok dengan pola yang diberikanforEach
mengeksekusi panggilan balik di semua paha depan yang cocokevery
pengembalian apakah panggilan balik pada quads yang cocok selalu mengembalikan truesome
mengembalikan apakah panggilan balik pada quads yang cocok mengembalikan true setidaknya sekaligetSubjects
mengembalikan serangkaian subjek unik yang terjadi di paha depan yang cocokforSubjects
mengeksekusi panggilan balik pada subjek unik yang terjadi di paha depan yang cocokgetPredicates
mengembalikan serangkaian predikat unik yang terjadi di quad yang cocokforPredicates
mengeksekusi panggilan balik pada predikat unik yang terjadi di paha depan yang cocokgetObjects
mengembalikan serangkaian objek unik yang terjadi di quad yang cocokforObjects
menjalankan panggilan balik pada objek unik yang terjadi di quads yang cocokgetGraphs
mengembalikan serangkaian grafik unik yang terjadi di quad yang cocokforGraphs
mengeksekusi panggilan balik pada grafik unik yang terjadi di paha depan yang cocok N3.JS mendukung penalaran sebagai berikut:
import { Reasoner , Store , Parser } from 'n3' ;
const parser = new Parser ( { format : 'text/n3' } ) ;
const rules = `
{
?s a ?o .
?o <http://www.w3.org/2000/01/rdf-schema#subClassOf> ?o2 .
} => {
?s a ?o2 .
} .
`
const rulesDataset = new Store ( parser . parse ( rules ) ) ;
const dataset = new Store ( /* Dataset */ )
// Applies the rules to the store; mutating it
const reasoner = new Reasoner ( store ) ;
reasoner . reason ( rules ) ;
Catatan : N3.JS saat ini hanya mendukung aturan dengan pola grafik dasar di premis dan kesimpulan. Built-in dan rantai mundur tidak didukung. Untuk penalaran RDF/JS yang mendukung semua fitur penalaran notasi3, lihat Eye-Js.
Parser dan penulis N3.JS sepenuhnya kompatibel dengan spesifikasi W3C berikut:
Selain itu, parser N3.JS juga mendukung Notation3 (N3) (belum ada spesifikasi resmi).
Parser dan penulis N3.JS juga sepenuhnya kompatibel dengan varian RDF-Star dari spesifikasi W3C.
Mode default adalah permisif dan memungkinkan campuran sintaksis yang berbeda, termasuk RDF-Star. Lewati opsi format
ke konstruktor dengan nama atau tipe mime format untuk perilaku yang ketat dan tidak toleran. Jika string format berisi star
atau *
(mis. turtlestar
atau TriG*
), dukungan RDF-Star untuk format itu akan diaktifkan.
Submodul N3.js kompatibel dengan antarmuka RDF.js berikut:
N3.DataFactory
mengimplementasikan DataFactory
Term
implementasi dan salah satu dari NamedNode
, BlankNode
, Literal
, Variable
, DefaultGraph
Term
, Triple
dan Quad
N3.StreamParser
mengimplementasikan Stream
dan Sink
N3.StreamWriter
mengimplementasikan Stream
dan Sink
N3.Store
mengimplementasikan DatasetCore
Sink
Source
Store
Perpustakaan N3.JS dilindungi hak cipta oleh Ruben Verborgh dan dirilis di bawah lisensi MIT.
Kontribusi dipersilakan, dan laporan bug atau permintaan tarik selalu membantu. Jika Anda berencana untuk mengimplementasikan fitur yang lebih besar, yang terbaik adalah menghubungi saya terlebih dahulu.