N3.JSライブラリは、JavaScriptのRDFを簡単に処理できるRDF.JS低レベルの仕様の実装です。それは提供します:
解析と書き込みは次のとおりです。
node.jsの場合、n3.jsはNPMパッケージとして提供されます。
$ npm install n3
const N3 = require ( 'n3' ) ;
n3.jsは、Webpackまたはbrowserifyを介してブラウザでシームレスに動作します。これらのツールに慣れていない場合は、 Webpack:Bundleの作成 - 開始またはBROWSERIFYの紹介を読むことができます。 「UMDバンドル」を作成し、名前を提供する必要があります(たとえば、browserifyの-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
、コールバックを介して、カメ、トリグ、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 ) ;
} ) ;
コールバックの最初の引数はオプションのエラー値であり、2番目はクワッドです。クワッドがない場合、コールバックは最後にもう一度呼び出され、 null
for quad
と3番目の引数としてプレフィックスのハッシュがあります。
あるいは、 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トリプル、n quadの許容スーパーセットを解析します。
これらの言語のいずれかとの厳格な互換性については、作成時にformat
引数を渡します。
const parser1 = new N3 . Parser ( { format : 'N-Triples' } ) ;
const parser2 = new N3 . Parser ( { format : 'application/trig' } ) ;
Notation3(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}_
プレフィックスを使用してブランクノードラベルをプレフィックスします。これは、同一のラベルを持つ無関係な空白ノードの衝突を防ぐために行われます。 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.Writer
Quadを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
addQuad
介してnode.jsストリームにクワッドを書き込むこともできます。
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
ありますgetSubjects
一致するクワッドで発生する一連のユニークな被写体を返しますforSubjects
一致するクワッドで発生する一意の主題に関するコールバックを実行しますgetPredicates
一致するクワッドで発生する一連の独自の述語を返しますforPredicates
一致するクワッドで発生する一意の述語に関するコールバックを実行しますgetObjects
一致するクワッドで発生する一意のオブジェクトの配列を返しますforObjects
一致するクワッドで発生する一意のオブジェクトのコールバックを実行します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は現在、前提と結論に基本的なグラフパターンを持つルールのみをサポートしています。ビルトインと後方チェーンはサポートされていません。すべてのNotation3の推論機能をサポートするRDF/JS推論者については、Eye-JSを参照してください。
N3.JSパーサーとライターは、次のW3C仕様と完全に互換性があります。
さらに、N3.JSパーサーはNotation3(N3)もサポートしています(まだ公式の仕様はありません)。
N3.JSパーサーとライターは、W3C仕様のRDF-STARバリエーションと完全に互換性があります。
デフォルトモードは許容され、RDF-STARを含むさまざまな構文の混合を許可します。 format
オプションをコンストラクターに渡します。これは、厳格な障害不耐性動作のためのフォーマットの名前またはMIMEタイプを使用します。フォーマット文字列にstar
または*
(たとえば、 turtlestar
またはTriG*
)が含まれている場合、その形式のRDF-STARサポートが有効になります。
N3.JSサブモジュールは、次のRDF.JSインターフェイスと互換性があります。
N3.DataFactory
DataFactory
を実装しますTerm
を作成する用語とNamedNode
、 BlankNode
、 Literal
、 Variable
、 DefaultGraph
の1つTerm
、 Triple
、 Quad
を作成するトリプル/クワッドN3.StreamParser
Stream
とSink
を実装しますN3.StreamWriter
Stream
とSink
を実装しますN3.Store
Store
Source
Sink
DatasetCore
を実装していますN3.JSライブラリはRuben Verborghによって著作権で保護され、MITライセンスの下でリリースされています。
貢献は大歓迎です。バグレポートまたはプルリクエストは常に役立ちます。より大きな機能を実装する予定がある場合は、最初に私に連絡するのが最善です。