مكتبة N3.JS هي تطبيق للمواصفات المنخفضة على مستوى RDF.JS والتي تتيح لك التعامل مع RDF في JavaScript بسهولة. يقدم:
التحليل والكتابة هو:
لـ Node.js ، يأتي N3.js كحزمة NPM.
$ npm install n3
const N3 = require ( 'n3' ) ;
N3.JS يعمل بسلاسة في المتصفحات عبر WebPack أو Browserify. إذا لم تكن معتادًا على هذه الأدوات ، فيمكنك قراءة WebPack: إنشاء حزمة - البدء أو مقدمة في Browserify . ستحتاج إلى إنشاء "حزمة 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
في بقية هذا المستند ، سنتعامل مع "Triples" و "Quads" بالتساوي: نفترض أن رباعيًا هو ببساطة ثلاثة أضعاف في رسم بياني مسمى أو افتراضي.
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 ) ;
} ) ;
الوسيطة الأولى للاستدعاء هي قيمة خطأ اختيارية ، والثانية هي رباعية. إذا لم يكن هناك المزيد من الكواد ، فسيتم استدعاء رد الاتصال في المرة الأخيرة مع 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' } ) ;
من الممكن توفير قاعدة الوثيقة التي تريد تحليلها. يتم ذلك عن طريق تمرير حجة 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 وتنفيذ Sink 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
يسلطات Quads كوثيقة 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 وتنفيذ Sink 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
يتيح لك تخزين ثلاث مرات في الذاكرة والعثور عليها بسرعة.
في هذا المثال ، نقوم بإنشاء متجر جديد ونضيف Triples :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
إرجاع مجموعة من المستحضرات الفريدة التي تحدث في مطابقة رباعية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 حاليًا القواعد فقط مع أنماط الرسم البياني الأساسي في الفرضية والاستنتاج. لا يتم دعم المدمجون والتوصيل للخلف. للحصول على عقل 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
Source
Sink
يتم وضع حقوق الطبع والنشر لمكتبة N3.JS من قبل Ruben Verborgh وإصدارها تحت رخصة معهد ماساتشوستس للتكنولوجيا.
المساهمات مرحب بها ، وتقارير الأخطاء أو طلبات السحب مفيدة دائمًا. إذا كنت تخطط لتنفيذ ميزة أكبر ، فمن الأفضل الاتصال بي أولاً.