Библиотека N3.JS является реализацией спецификации низкого уровня RDF.JS, которая позволяет легко обрабатывать RDF в JavaScript. Он предлагает:
Расположение и письмо:
Для node.js N3.js поставляется в качестве пакета NPM.
$ npm install n3
const N3 = require ( 'n3' ) ;
N3.JS плавно работает в браузерах через WebPack или Browserify. Если вы не знакомы с этими инструментами, вы можете прочитать WebPack: Создание пакета - начало работы или введения в браузероиз . Вам нужно будет создать «пакет UMD» и предоставить имя (например, опция -s N3
в браузерефии).
Вы также можете загрузить его через CDN:
< script src =" https://unpkg.com/n3/browser/n3.min.js " > </ script >
N3.JS следует по спецификации низкого уровня RDF.JS.
N3.DataFactory
даст вам функции завода для создания тройки и квадратов:
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
В остальной части этого документа мы будем одинаково относиться к «тройкам» и «квадратным»: мы предполагаем, что квадроцикл - это просто тройной в именованном графике или по умолчанию.
N3.Parser
Преобразует документ Turtle, Trig, N-Triples или N-Quads в квадроцикле посредством обратного вызова:
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 ) ;
} ) ;
Первый аргумент обратного вызова является необязательным значением ошибки, вторым является квадроцикл. Если больше нет квадратов, обратный вызов вызывается в последний раз с null
для quad
и хэш префиксов в качестве третьего аргумента.
В качестве альтернативы могут быть предоставлены объект, где onQuad
, onPrefix
и onComment
используются для прослушивания quads
, prefixes
и comments
следующим образом:
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 ) ; } ,
} ) ;
Если обратные вызовы не предоставляются, анализ происходит синхронно, возвращая массив квадратов:
const parser = new N3 . Parser ( ) ;
// An array of resultant Quads
const quadArray = parser . parse ( tomAndJerry ) ;
По умолчанию N3.Parser
анализирует разрешающий суперсет черепахи, триггера, N-Triples и N-Quads.
Для строгой совместимости с любым из этих языков передайте аргумент format
при создании:
const parser1 = new N3 . Parser ( { format : 'N-Triples' } ) ;
const parser2 = new N3 . Parser ( { format : 'application/trig' } ) ;
Нотация3 (N3) поддерживается только через аргумент format
:
const parser3 = new N3 . Parser ( { format : 'N3' } ) ;
const parser4 = new N3 . Parser ( { format : 'Notation3' } ) ;
const parser5 = new N3 . Parser ( { format : 'text/n3' } ) ;
Можно предоставить базовый IRI документа, который вы хотите проанализировать. Это делается путем передачи аргумента baseIRI
при создании:
const parser = new N3 . Parser ( { baseIRI : 'http://example.org/' } ) ;
По умолчанию N3.Parser
будет префиксом пустых метков, с помощью b{digit}_
Prefix. Это сделано для предотвращения столкновений не связанных с пустыми узлами, имеющими идентичные этикетки. Аргумент конструктора blankNodePrefix
может использоваться для изменения префикса или, если установить на пустую строку, полностью отключите префикс:
const parser = new N3 . Parser ( { blankNodePrefix : '' } ) ;
N3.Parser
может проанализировать потоки node.js по мере их роста, возвращая квадраты, как только они будут готовы.
const parser = new N3 . Parser ( ) ,
rdfStream = fs . createReadStream ( 'cartoons.ttl' ) ;
parser . parse ( rdfStream , console . log ) ;
N3.StreamParser
- это поток Node.js и реализация RDF.JS. Это решение идеально, если ваш потребитель медленнее, поскольку исходные данные читаются только тогда, когда потребитель готов.
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 ;
}
Выделенное событие prefix
сигнализирует о каждом префиксе с prefix
и term
аргументами. Выделенное событие comment
может быть включено, установив comments: true
в конструкторе N3.StreamParser.
N3.Writer
сериализует квадраты в качестве документа RDF. Напишите квадраты через 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 ) ) ;
По умолчанию N3.Writer
пишет черепаху (или триггера, если некоторые квадроциклы находятся в названном графике).
Чтобы написать N-Triples (или N-Quads) вместо этого, передайте аргумент format
при создании:
const writer1 = new N3 . Writer ( { format : 'N-Triples' } ) ;
const writer2 = new N3 . Writer ( { format : 'application/trig' } ) ;
N3.Writer
также может написать квадроцикл в потоку node.js через 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
- это поток Node.js и реализация 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 ) ;
Возможно, вы захотите использовать […]
и списки (…)
обозначения черепахи и триг. Тем не менее, потоковой писатель не может создавать эти автоматические: сокращенные обозначения возможны только в том случае, если пустые узлы или головки списков не используются позже, что можно определить только в конце потока.
Функции blank
и list
позволяют вместо этого создавать их вручную:
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
позволяет хранить тройки в памяти и найти их быстро.
В этом примере мы создаем новый магазин и добавляем тройки :Pluto a :Dog.
и :Mickey a :Mouse
.
Затем мы находим тройки с :Mickey
как субъект.
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 ) ;
Если вы используете несколько магазинов, вы можете сократить потребление памяти, позволяя им поделиться индексом сущностей:
const entityIndex = new N3 . EntityIndex ( ) ;
const store1 = new N3 . Store ( [ ] , { entityIndex } ) ;
const store2 = new N3 . Store ( [ ] , { entityIndex } ) ;
Dataset
Этот магазин придерживается интерфейса Dataset
, который раскрывает следующие свойства
Атрибуты:
size
-неотрицательное целое число, которое указывает количество квадратов в наборе.Методы:
add
- добавляет указанный квадроцикл в набор данных. Существующие квадроциклы, как определено в Quad.equals
, будут проигнорированы.delete
- удаляет указанный квадроцикл из набора данных.has
- определяет, включает ли набор данных определенный квадроцикл.match
- Возвращает новый набор данных, который состоит из всех квадроциклов в текущем экземпляре, соответствующем данным аргументам.[Symbol.iterator]
- реализует протокол итератора, чтобы разрешить итерацию по всем quads
набору набора данных, как в примере выше. Хранилище реализует следующие методы манипуляции в дополнение к стандартному интерфейсу Dataset
(документация):
addQuad
чтобы вставить один квадроциклaddQuads
чтобы вставить массив квадратовremoveQuad
чтобы удалить один квадроциклremoveQuads
чтобы удалить массив квадратовremove
, чтобы удалить поток четырехremoveMatches
для удаления всех квадроциклов, соответствующих данному шаблонуdeleteGraph
для удаления всех квадроцикл с помощью данного графикаcreateBlankNode
возвращает неиспользованный идентификатор пустого узлаМагазин предоставляет следующие методы поиска (документация):
match
возвращает поток и генератор квадратов, соответствующих данному шаблонуgetQuads
возвращает массив квадратов, соответствующих данному шаблонуcountQuads
считает количество квадратов, соответствующих данному шаблонуforEach
выполняет обратный вызов на всех соответствующих квадратахevery
возвращает, всегда возвращает вызыв на соответствующих квадратахsome
возвращаются, вернется ли обратный вызов при сопоставлении Quads, по крайней мере, один разgetSubjects
возвращает множество уникальных предметов, встречающихся в соответствующих квадратахforSubjects
выполняет обратный вызов по уникальным предметам, встречающимся в соответствующих квадратахgetPredicates
возвращает множество уникальных предикатов, встречающихся в соответствующей QuadforPredicates
выполняет обратный вызов по уникальным предикатам, встречающимся в соответствующих квадратахgetObjects
возвращает массив уникальных объектов, встречающихся в соответствующем QuadforObjects
выполняет обратный вызов на уникальные объекты, возникающие в соответствующих квадратахgetGraphs
возвращает массив уникальных графиков, встречающихся в соответствующем квадроциклеforGraphs
выполняет обратный вызов на уникальных графиках, встречающихся в соответствующих квадратах N3.JS поддерживает рассуждения следующим образом:
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 ) ;
Примечание . В настоящее время N3.JS поддерживает только правила с основными шаблонами графиков в предпосылке и заключении. Встроенные и обратные цепочки не поддерживаются. Для сосуды RDF/JS, который поддерживает все функции обоснования 3 нотации, см. Eye-JS.
Стоярь и писатель N3.JS полностью совместим со следующими спецификациями W3C:
Кроме того, анализатор N3.JS также поддерживает нотацию3 (N3) (официальная спецификация еще).
Парсер и писатель N3.JS также полностью совместимы с вариантами RDF-Star спецификаций W3C.
Режим по умолчанию является разрешающим и позволяет смесь различных синтаксисов, включая RDF-Star. Передайте опцию format
конструктору с именем или типом MIME формата для строгого, непереносимого поведения. Если строка формата содержит star
или *
(например, turtlestar
или TriG*
), поддержка RDF-Star для этого формата будет включена.
Подмодулы N3.JS совместимы со следующими интерфейсами rdf.js:
N3.DataFactory
реализует DataFactory
Term
и один из NamedNode
, BlankNode
, Literal
, Variable
, DefaultGraph
Term
, Triple
и Quad
N3.StreamParser
реализует Stream
и Sink
N3.StreamWriter
реализует Stream
и Sink
N3.Store
DatasetCore
Store
Sink
Source
Библиотека N3.JS защищена авторским правом Рубеном Верборгом и выпущена по лицензии MIT.
Взносы приветствуются, и отчеты об ошибках или запросы на привлечение всегда полезны. Если вы планируете реализовать более крупную функцию, лучше всего связаться со мной.