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许可发布。
欢迎贡献,错误报告或拉动请求总是有帮助的。如果您打算实施更大的功能,最好先与我联系。