N3.JS庫是RDF.JS低級規範的實現,可讓您輕鬆地在JavaScript中處理RDF。它提供:
解析和寫作是:
對於node.js,n3.js作為NPM軟件包。
$ npm install n3
const N3 = require ( 'n3' ) ;
N3.js通過WebPack或瀏覽中無縫地在瀏覽器中工作。如果您不熟悉這些工具,則可以閱讀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
將烏龜,Trig,N-Triples或N-Quads文檔轉換為四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' } ) ;
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
參數信號。可以通過設置comments: true
在N3.StreamParser構造器中啟用專用comment
事件。
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
寫烏龜(如果某些四邊形在命名圖中,則trig)。
要編寫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 ) ;
您可能需要使用烏龜和trig的[…]
並列表(…)
符號。但是,流媒體作者無法自動創建這些內容:只有在以後不使用空白節點或列表頭時,速記符號才有可能,只能在流的末尾最終確定。
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
- 從數據集中刪除指定的Quad。has
- 確定數據集是否包含某個四邊形。match
- 返回一個由與給定參數匹配的當前實例中所有四倍組成的新數據集。[Symbol.iterator]
quads
該商店除了標準Dataset
集接口(文檔)外,還實施了以下操作方法:
addQuad
以插入一個四邊形addQuads
removeQuad
Quad QuadremoveQuads
以刪除四邊形數組remove
以刪除四邊形流removeMatches
以刪除與給定模式匹配的所有四QuadsdeleteGraph
可以用給定的圖刪除所有四邊形createBlankNode
返回未使用的空白節點標識符該商店提供以下搜索方法(文檔):
match
返回符合給定模式的四邊形的流和發電機getQuads
返回一系列符合給定模式的四邊形countQuads
計算與給定模式匹配的四邊形的數量forEach
在所有匹配的四邊形上執行回調every
回報是否匹配四邊形的回調始終返回truesome
返回匹配四邊形的回調是否至少返回true一次getSubjects
返回一系列在匹配四邊形中發生的獨特主題forSubjects
對匹配四邊形中發生的唯一主題執行回調getPredicates
返回匹配四匹匹配中發生的一系列獨特謂詞forPredicates
在匹配四邊形中發生的唯一謂詞執行回調getObjects
返回在匹配Quad中發生的一系列唯一對象forObjects
對匹配四邊形中發生的唯一對象執行回調getGraphs
返回匹配Quad中出現的一系列獨特圖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.J當前僅支持在前提和結論中具有基本圖形模式的規則。不支持內置和向後鍊子。有關支持所有notation3推理功能的RDF/JS推理器,請參見Eye-js。
N3.JS解析器和作者與以下W3C規格完全兼容:
此外,N3.JS解析器還支持Note3(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
之一Term
三元組/ Quad
Triple
N3.StreamParser
實現了Stream
和Sink
N3.StreamWriter
實現了Stream
和Sink
N3.Store
實現Store
Source
Sink
DatasetCore
N3.JS圖書館由Ruben Verborgh版權保護,並根據MIT許可發布。
歡迎貢獻,錯誤報告或拉動請求總是有幫助的。如果您打算實施更大的功能,最好先與我聯繫。