eyereasoner / eye-js Goto Github PK
View Code? Open in Web Editor NEWA distribution of EYE reasoner in the JavaScript ecosystem using Webassembly.
Home Page: https://eyereasoner.github.io/eye-js/example/
License: MIT License
A distribution of EYE reasoner in the JavaScript ecosystem using Webassembly.
Home Page: https://eyereasoner.github.io/eye-js/example/
License: MIT License
These are action items after #294 merges
Have been told there are still memory leaks in firefox. This is an issue to investigate.
Please supply details / repros here if you've experienced this issue.
Apparently, log:collectAllIn
works only when the scope is the current document. The following example:
@prefix log: <http://www.w3.org/2000/10/swap/log#> .
@prefix : <http://example.org/> .
{
(?x { ?x a :Test } ?xs) log:collectAllIn { :x a :Test }
}
=>
{
?xs a :Result
}.
gives the error:
Error: Error while executing query: Foreign predicate shell/2 did not clear exception: error(system_error,context(shell/2,Function not implemented))
** ERROR ** eam ** error(existence_error(source_sink,/tmp/swipl_eye_42_4),context(system:open/4,No such file or directory))
The native eye returns (:x) a :Result.
Once SWI-Prolog/npm-swipl-wasm#22 or SWI-Prolog/npm-swipl-wasm#23 is solved we should:
maxEventListeners
process.setMaxListeners(100)
from the test suiteWe should add performance testing using something like https://github.com/marketplace/actions/continuous-benchmark - especially in light of #276 altering to a degradation if we were to update the version of swipl-wasm we use.
Great library!! Could you please give an example of how to use eye-js in the browser, if possible?
When passing data graph and query graph as two arguments, rule chaining doe not work. The example from n3 spec works fine but when passed to the reasoner as two arguments, only the first rule produces derivations. The same when inputs are RDF/JS quads
const { n3reasoner } = require('eyereasoner')
await n3reasoner(`
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix : <http://example.org/#>.
:spiderman a :WebSlinger .
:44th :traffic :heavy .
`, `
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix : <http://example.org/#>.
{ ?slinger a :WebSlinger } => { ?slinger :locomotion :flying } .
{ ?heli a :Helicopter } => { ?heli :locomotion :flying } .
{ ?flyer :locomotion :flying . ?street :traffic :heavy }
=> { ?street :suitable-observer ?flyer } .
`)
I'm wondering how much information is contained in the pvm
image; in particular has it pre-loaded many/any of the SWIPL modules (such as those listed in https://github.com/SWI-Prolog/swipl-devel/blob/master/src/wasm/exports.json) which would allow us to create a custom minified build of SWIPL?
I tried the following as per the README (great job btw :-) to pass any flag to eye-js:
https://notation3.org/eyejs/test-strings.html
But the "--strings" flag does not seem to work. As a sanity check I also tried with "--pass-only-new" which outputs the expected inferences. Also checked the N3 code with the command-line eye (using strings flag) and it works there.
Since 0375315 our workflows have become quite flakey because one of the GitHub urls we are requesting seems to be 404ing at a high rate. If this keeps happening we may need to change the method we use to retrieve the eye.pl
asset.
See #36 (comment)
To catch regressions once #1066 (comment) is resolved.
hello, is the log:semantics
built-in available?
The following example seems to work in eye but not in eye-js.
To catch errors such as SWI-Prolog/npm-swipl-wasm#105 we should add tests to make sure that there is nothing logged to the console during eyereasoner
function calls.
See #1107 (comment)
To run RDF Surfaces in the eye-js I require no extra --pass*
options for the eye reasoner.
const result = await n3reasoner(data, undefined, {
output: undefined,
bnodeRelabeling: false,
outputType: 'string'
});
Does not work as expected due to a missing break in https://github.com/eyereasoner/eye-js/blob/main/lib/transformers.ts#L96
When using eye.4.25.2 in a project of mine I get
warning "koreografeye > [email protected]" has unmet peer dependency "@rdfjs/types@^1.1.0".
the following rule works fine in the browser but gives no result using node.
@prefix : <http://ex.org/> .
@prefix log: <http://www.w3.org/2000/10/swap/log#> .
:a :b :c, :d .
{
(?x
{:a :b ?x }
?list) log:collectAllIn _:x .
}
=>
{
:result :is ?list
} .
Apparently, its serialization in the temporary file is missing {:a :b ?x }
<http://ex.org/a> <http://ex.org/b> <http://ex.org/c> .
<http://ex.org/a> <http://ex.org/b> <http://ex.org/d> .
{
_:n3-1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> ?x .
_:n3-1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:n3-3 .
_:n3-1 <http://www.w3.org/2000/10/swap/log#collectAllIn> _:n3-0.x .
_:n3-3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> ?list .
_:n3-3 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
} => {<http://ex.org/result> <http://ex.org/is> ?list . } .
Once rdfjs/N3.js#324 is closed we should remove the workaround that we are introducing in v3.
Mainly happening in the Windows CI. Seems to be because of a race condition because they finish in 15min rather than 60 otherwise.
See https://github.com/eyereasoner/eye-js/actions/runs/5250540398/jobs/9484596452?pr=387 for example
How can one catch errors thrown by eye-js? It seems they are directly logged using console.warn
but I'd like to show them to the user.
eyereasoner.n3reasoner(
"abc",
undefined,
{ output: 'derivations' }
)
.then((success) => console.log(success))
.catch((error) => console.log(error)); // not catching anything
Discovered by @josd
On the extended deep taxonomy benchmark with --turtle
we get
$ time eye --quiet --nope test-facts.ttl test-dl.ttl test-rules.n3 --query test-query.n3
@prefix : <http://eulersharp.sourceforge.net/2009/12dtb/test#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
:i100000 a :N100000.
real 0m14.959s
user 0m16.278s
sys 0m0.431s
With eye-js this doesn't produce the answer after running 10 times longer:
$ time eyereasoner --quiet --nope test-facts.ttl test-dl.ttl test-rules.n3 --query test-query.n3
@prefix : <http://eulersharp.sourceforge.net/2009/12dtb/test#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
real 0m51.283s
user 0m51.695s
sys 0m0.211s
See this failed job https://github.com/eyereasoner/eye-js/actions/runs/6789188761/job/18455853680?pr=703 on a branch that doesn't modfiy anything but workflow configs.
In particular the result is
Run npm test
> [email protected] test
> npm run test:unit && npm run test:memory
npm WARN cli npm v10.2.3 does not support Node.js v16.20.2. This version of npm supports the following node versions: `^18.17.0 || >=20.5.0`. You can find the latest version at [https://nodejs.org/.](https://nodejs.org/)
> [email protected] test:unit
> npm run bundle:webpack && jest
npm WARN cli npm v10.2.3 does not support Node.js v16.20.2. This version of npm supports the following node versions: `^18.17.0 || >=20.5.0`. You can find the latest version at [https://nodejs.org/.](https://nodejs.org/)
> [email protected] bundle:webpack
> webpack --config webpack.config.js
asset index.js 3.35 MiB [emitted] [minimized] [big] (name: main) 1 related asset
orphan modules 120 KiB [orphan] 9 modules
runtime modules 1.25 KiB 6 modules
modules by path ./node_modules/ 3.16 MiB
modules by path ./node_modules/readable-stream/lib/ 191 KiB 24 modules
modules by path ./node_modules/swipl-wasm/dist/ 2.77 MiB 2 modules
+ 10 modules
modules by path ./dist/*.js 474 KiB
./dist/index.js 1.17 KiB [built] [code generated]
./dist/query.js 741 bytes [built] [code generated]
./dist/transformers.js 4.11 KiB [built] [code generated]
+ 2 modules
fs (ignored) 15 bytes [built] [code generated]
path (ignored) 15 bytes [built] [code generated]
crypto (ignored) 15 bytes [optional] [built] [code generated]
WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
This can impact web performance.
Assets:
index.js (3.35 MiB)
WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
Entrypoints:
main (3.35 MiB)
index.js
WARNING in webpack performance recommendations:
You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application.
For more info visit https://webpack.js.org/guides/code-splitting/
webpack 5.89.0 compiled with 3 warnings in 8043 ms
PASS __tests__/cli-test.ts (21.065 s)
PASS __tests__/browser-test.ts (48.916 s)
FAIL __tests__/e2e-test.ts (50.308 s)
● Testing browsers › should be able to call the execute function in firefox
expect(received).resolves.toEqual(expected) // deep equality
Expected: "@prefix : .:Socrates a :Mortal."
Received: ""
36 |
37 | await expect(page.textContent('textarea[id=data]').then((r) => r?.trim())).resolves.toEqual(data.trim());
> 38 | await expect(page.textContent('div[id=result]').then((r) => r?.trim())).resolves.toEqual('@prefix : .:Socrates a :Mortal.');
| ^
39 |
40 | await page.click('button[id=clear]');
41 | // Time for new result to be inserted in the DOM
at Object.toEqual (node_modules/expect/build/index.js:174:22)
at Object.<anonymous> (__tests__/e2e-test.ts:38:90)
PASS __tests__/node-test.ts (31.2 s)
A worker process has failed to exit gracefully and has been force exited. This is likely caused by tests leaking due to improper teardown. Try running with --detectOpenHandles to find leaks. Active timers can also cause this, ensure that .unref() was called on them.
---------------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
---------------------|---------|----------|---------|---------|-------------------
All files | 100 | 98.21 | 100 | 100 |
dist | 100 | 100 | 100 | 100 |
eye.d.ts | 0 | 0 | 0 | 0 |
eye.js | 100 | 100 | 100 | 100 |
index.d.ts | 0 | 0 | 0 | 0 |
n3Writer.temp.d.ts | 0 | 0 | 0 | 0 |
n3Writer.temp.js | 100 | 100 | 100 | 100 |
query.d.ts | 0 | 0 | 0 | 0 |
query.js | 100 | 100 | 100 | 100 |
transformers.d.ts | 0 | 0 | 0 | 0 |
transformers.js | 100 | 100 | 100 | 100 |
dist/bin | 100 | 88.88 | 100 | 100 |
index.d.ts | 0 | 0 | 0 | 0 |
main.d.ts | 0 | 0 | 0 | 0 |
main.js | 100 | 88.88 | 100 | 100 | 3
---------------------|---------|----------|---------|---------|-------------------
Test Suites: 1 failed, 3 passed, 4 total
Tests: 1 failed, 73 passed, 74 total
Snapshots: 0 total
Time: 61.82 s
Ran all test suites.
Might be a result of the bump in swipl-wasm?
We should run the n3 spec tests on eye-js. The easiest way of doing this may be by adding support for N3 reasoning tests to https://github.com/rubensworks/rdf-test-suite.js/.
I can't seem to be able to compile Koreografeye anymore that has an eyereasoner dependency. It keeps asking for EmscriptenModule any ideas? I'm on node 16.20.0
yarn run v1.22.19
$ npm run build:ts && npm run build:components
> [email protected] build:ts
> tsc ; chmod 755 dist/*js
node_modules/eyereasoner/dist/transformers.d.ts:1:23 - error TS2688: Cannot find type definition file for 'emscripten'.
1 /// <reference types="emscripten" />
~~~~~~~~~~
node_modules/eyereasoner/dist/transformers.d.ts:15:79 - error TS2304: Cannot find name 'EmscriptenModule'.
15 export declare function loadEyeImage(swipl: typeof SWIPL): (options?: Partial<EmscriptenModule> | undefined) => Promise<SWIPL.SWIPLModule>;
~~~~~~~~~~~~~~~~
node_modules/eyereasoner/dist/transformers.d.ts:19:52 - error TS2304: Cannot find name 'EmscriptenModule'.
19 export declare function SwiplEye(options?: Partial<EmscriptenModule> | undefined): Promise<SWIPL.SWIPLModule>;
~~~~~~~~~~~~~~~~
node_modules/swipl-wasm/dist/common.d.ts:1:23 - error TS2688: Cannot find type definition file for 'emscripten'.
1 /// <reference types="emscripten" />
~~~~~~~~~~
node_modules/swipl-wasm/dist/common.d.ts:70:14 - error TS2304: Cannot find name 'FS'.
70 FS: typeof FS;
~~
node_modules/swipl-wasm/dist/common.d.ts:85:21 - error TS2304: Cannot find name 'EmscriptenModule'.
85 options?: Partial<EmscriptenModule>
~~~~~~~~~~~~~~~~
Found 6 errors in 2 files.
Errors Files
3 node_modules/eyereasoner/dist/transformers.d.ts:1
3 node_modules/swipl-wasm/dist/common.d.ts:1
> [email protected] build:components
> componentsjs-generator -s dist
2023-05-10T17:11:47.905Z [Components.js] info: Generating components for 1 package
✨ Done in 5.62s
Raised by @phochste
Since the --turtle
flag allows files to be parsed in a time that is an order of magnitude faster, we should split our data inputs into a turtle and an n3 and use the --turtle
flag for parsing in the former case.
Doesn't cause any problems on actual releases - just annoying failure notifications https://github.com/eyereasoner/eye-js/actions/runs/4010764536/jobs/6887698043
We need to add tests for the following matrixes
fetch
is being used correctly across environments). See #5.eye.pl
and eye.pvm
Semantic release requires "BREAKING CHANGE" to be in the footer which we currently do not do
In #21 I have marked all APIs that instantiate eye via eye.pl
as deprecated; favoring initialization with eye.pvm
. I have also updated the docs accordingly.
I would like to know if there is any value in keeping these APIs or whether we can just remove them entirely; and make this library easier to maintain.
// cc @josd
We can probably get the GH pages distro under 1MB by using the web-specific build of SWIPL wasm (and setting up locateFile
to look for the .wasm
in github pages) once SWI-Prolog/npm-swipl-wasm#8 is merged.
We should be using a .n3s
file extension to pass data to eye.
In this commit the format of the output was changed. This broke some of our tests which do exact string matches so we need to manually do an update and adjust these tests at the same time.
Should look something like
name: Enable automerge on dependabot PRs
on:
pull_request_target:
jobs:
automerge:
name: Enable automerge on dependabot PRs
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
repository-projects: write
if: github.actor == 'dependabot[bot]' && !contains(github.head_ref, 'dependabot/npm_and_yarn/swipl-wasm-')
steps:
- uses: actions/checkout@v4
- run: gh pr merge ${{ github.event.pull_request.html_url }} --auto --squash
env:
GH_TOKEN: ${{ github.token }}
if: github.actor == 'dependabot[bot]' && contains(github.head_ref, 'dependabot/npm_and_yarn/swipl-wasm-')
steps:
- uses: actions/checkout@v4
- run: |
PR_TITLE="${{ github.event.pull_request.title }}"
before=$(echo $PR_TITLE | grep -oP '(?<=from )\d+\.\d+\.\d+')
after=$(echo $PR_TITLE | grep -oP '(?<=to )\d+\.\d+\.\d+')
readarray -d . -t before <<<"${before:2:-1}"
readarray -d . -t after <<<"${current:2:-1}"
if [ ! ${before[0]} == ${after[0]} ]; then
version="BREAKING CHANGE"
branchHead="breaking"
elif [ ! ${before[1]} == ${after[1]} ]; then
version="feat"
branchHead="feat"
elif [ ! ${before[2]} == ${after[2]} ]; then
version="fix"
branchHead="fix"
fi
PR_TITLE="${PR_TITLE//build/$version}"
- run: gh pr merge ${{ github.event.pull_request.html_url }} --auto --squash --body "$PR_TITLE"
env:
GH_TOKEN: ${{ github.token }}
Errors with
npm WARN prepare removing existing node_modules/ before installation
npm ERR! Cannot read property 'n3' of undefined
See #5 (comment).
@smessie - I want to make sure you are comfortable with moving that code here first. If you are it would be great if you could create a PR with the code; if you're too busy I can do it myself.
Hi, thanks for making this package :)
When trying to use it, I'm getting following error
✘ [ERROR] Cannot assign to "size" because it is a constant
../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js:2711:20:
2711 │ size = -1;
╵ ~~~~
The symbol "size" was declared a constant here:
../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js:2707:22:
2707 │ const size = parseInt(r.headers.get("content-length"));
╵ ~~~~
/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1566
let error = new Error(`${text}${summary}`);
^
Error: Build failed with 1 error:
../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js:2711:20: ERROR: Cannot assign to "size" because it is a constant
at failureErrorWithLog (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1566:15)
at /Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1024:28
at runOnEndCallbacks (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1438:61)
at buildResponseToResult (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1022:7)
at /Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:1134:14
at responseCallbacks.<computed> (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:671:9)
at handleIncomingPacket (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:726:9)
at Socket.readFromStdout (/Users/ieben/WebstormProjects/SWIPL-WASM-Example/node_modules/esbuild/lib/main.js:647:7)
at Socket.emit (node:events:513:28)
at addChunk (node:internal/streams/readable:324:12) {
errors: [
{
detail: undefined,
id: '',
location: {
column: 20,
file: '../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js',
length: 4,
line: 2711,
lineText: ' size = -1;',
namespace: '',
suggestion: ''
},
notes: [
{
location: {
column: 22,
file: '../eye-js/node_modules/eyereasoner/dist/swipl-bundled.temp.js',
length: 4,
line: 2707,
lineText: ' const size = parseInt(r.headers.get("content-length"));',
namespace: '',
suggestion: ''
},
text: 'The symbol "size" was declared a constant here:'
}
],
pluginName: '',
text: 'Cannot assign to "size" because it is a constant'
}
],
warnings: []
}
Node.js v18.12.1
When I looked at that location, the error is correct, in swipl-bundled.temp.js
the following code is included (formatted):
url_properties(url) {
return fetch(url, {method: "HEAD"}).then(r => {
if (r.status == 200) {
const size = parseInt(r.headers.get("content-length"));
const mods = r.headers.get("last-modified");
const time = Date.parse(mods) || 0;
if (!size instanceof Number) size = -1;
return {url: r.url, status: r.status, size: size, last_modified: time / 1e3}
} else {
return {url: url, status: r.status}
}
})
}
As you can see, size
is declared using a const
and later on being reassigned.
I'm not sure where to report this issue, but as I'm getting this error using this package, I'm reporting it here and then we'll see where the fix should happen in the end :)
Otherwise we get the Emscripten type issues.
Wondering whether eye-js has multi-query support, i.e., a query-answer loop (@josd had graciously re-added this to the regular eye a while back)?
I'm aware of the queryOnce method - perhaps it could be as easy as invoking a multi()
method on the module? :-) (or, perhaps this is wishful thinking and I misinterpreted that method call!)
error Lines: 1229, 1271 https://github.com/eyereasoner/eye-js/tree/%7B%7B%20urlEncodedRefName%20%7D%7D
Status: 404 Not Found
The link is broken. Double-check that you have not made any typo, or mistake in copy-pasting. If the link points to a resource that no longer exists, you may want to remove or fix the link.
error Line: 2319 https://eyereasoner.github.io/eye-js/example/index.html
Status: 404 Not Found
The link is broken. Double-check that you have not made any typo, or mistake in copy-pasting. If the link points to a resource that no longer exists, you may want to remove or fix the link.
error Lines: 145, 585, 598, 632, 645, 670, 683, 708, 721, 859, 974, 1067, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2064, 2071, 2198, 2261, 2302, 2315, 2321, 2679, 2680 https://github.com/eyereasoner/eye-js
Status: 200 OK
Some of the links to this resource point to broken URI fragments (such as index.html#fragment).
Broken fragments:
https://github.com/eyereasoner/eye-js#usage (lines 2046, 2071)
https://github.com/eyereasoner/eye-js#license (lines 2051, 2321)
https://github.com/eyereasoner/eye-js#advanced-usage (lines 2047, 2198)
https://github.com/eyereasoner/eye-js#examples (lines 2050, 2315)
https://github.com/eyereasoner/eye-js#cli-usage (lines 2049, 2302)
https://github.com/eyereasoner/eye-js#eye-js (lines 2045, 2064)
https://github.com/eyereasoner/eye-js#selecting-the-swipl-module (lines 2048, 2261)
In particular the pinned version in the package.json (originally pinned here 559ed6a)
We should remove
Lines 4 to 9 in bec3571
With eye, I can use the log:uuid
build in to create a uuid string.
E.g.
@prefix : <urn:example:> .
@prefix log: <http://www.w3.org/2000/10/swap/log#> .
@prefix string: <http://www.w3.org/2000/10/swap/string#> .
{
# Generates UUID Y using IRI X
# X an iri
# Y a string
:test log:uuid ?Y .
( "urn:uuid:" ?Y ) string:concatenation ?YT .
?Z log:uri ?YT .
}
=>
{
:Result :uuid ?Z .
} .
Will result in
@prefix : <urn:example:> .
@prefix log: <http://www.w3.org/2000/10/swap/log#>.
@prefix string: <http://www.w3.org/2000/10/swap/string#>.
:Result :uuid <urn:uuid:e85be12a-ea7b-11ed-ad97-8f98520311e0>.
However, when I execute the following code with the eyereasoner
, I get no uuid uri:
import { n3reasoner,SwiplEye,queryOnce } from 'eyereasoner';
async function main() {
const queryString = `
@prefix : <http://example.org/socrates#>.
@prefix log: <http://www.w3.org/2000/10/swap/log#> .
@prefix string: <http://www.w3.org/2000/10/swap/string#> .
{:Socrates a ?WHAT} => {:Socrates a ?WHAT}.
{
:test log:uuid ?Y .
( "urn:uuid:" ?Y ) string:concatenation ?YT .
?Z log:uri ?YT .
}
=>
{
:Result :uuid ?Z .
} .
`;
const dataString = `
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix : <http://example.org/socrates#>.
:Socrates a :Human.
:Human rdfs:subClassOf :Mortal.
{?A rdfs:subClassOf ?B. ?S a ?A} => {?S a ?B}.
`;
// The result of the query (as a string)
// Instantiate a new SWIPL module and log any results it produces to the console
const Module = await SwiplEye({ print: (str: string) => { console.log(str) }, arguments: ['-q'] });
// Load the the strings data and query as files data.n3 and query.n3 into the module
Module.FS.writeFile('data.n3', dataString);
Module.FS.writeFile('query.n3', queryString);
// Execute main(['--nope', '--quiet', './data.n3', '--query', './query.n3']).
queryOnce(Module, 'main', ['--nope', '--quiet', './data.n3', '--query', './query.n3']);
}
main()
So my question is, can the log:uuid
built-in also be part of the wasm eye reasoner?
Several tests have been timing out on the browser memory tests (see https://github.com/eyereasoner/eye-js/actions/runs/4559958889/jobs/8044445996?pr=216).
There is something going wrong in the pipeline of parsing and re-serialising the document (I would imagine that N3.js is already doing the re-labelling). b6a67f0 should be re-enabled at some point.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.