From 60e81fa6369945a33e01effd3ae36af40f29d869 Mon Sep 17 00:00:00 2001 From: Jesse Wright Date: Sun, 3 Apr 2022 10:35:42 +1000 Subject: [PATCH] feat: wire up rule optimization actors --- .componentsjs-generator-config.json | 5 +- .../config/optimize-rule/actors.json | 9 ++- .../config/reasoning-default.json | 1 + engines/config-reasoning/package.json | 2 - .../query-sparql-file-reasoning/package.json | 4 +- engines/query-sparql-reasoning/package.json | 4 +- package.json | 8 +-- .../actor-dereference-rule-parse/package.json | 3 +- .../ActorOptimizeRulePatternRestriction.ts | 13 ++-- .../package.json | 2 +- ...ctorOptimizeRulePatternRestriction-test.ts | 66 +++++++++++++++++++ .../package.json | 2 +- packages/actor-rule-parse-hylar/package.json | 3 +- .../package.json | 4 +- packages/bus-rdf-reason/package.json | 7 +- packages/reasoning-mocks/package.json | 6 +- packages/reasoning-types/package.json | 4 +- 17 files changed, 98 insertions(+), 45 deletions(-) diff --git a/.componentsjs-generator-config.json b/.componentsjs-generator-config.json index 2e91a9158..91f943a27 100644 --- a/.componentsjs-generator-config.json +++ b/.componentsjs-generator-config.json @@ -17,10 +17,7 @@ "Headers", "Readable", "LRUCache", - "RuleStream", - "IActionContext", - "Algebra.Pattern", - "AsyncIterator" + "RuleStream" ], "modulePrefix": { "@comunica/bus-dereference-rule": "cbdrl" diff --git a/engines/config-reasoning/config/optimize-rule/actors.json b/engines/config-reasoning/config/optimize-rule/actors.json index 2b7e3bc92..4973f53fe 100644 --- a/engines/config-reasoning/config/optimize-rule/actors.json +++ b/engines/config-reasoning/config/optimize-rule/actors.json @@ -1,7 +1,9 @@ { "@context": [ - "https://linkedsoftwaredependencies.org/bundles/npm/@comunica/runner/^2.0.0/components/context.jsonld" - ], + "https://linkedsoftwaredependencies.org/bundles/npm/@comunica/runner/^2.0.0/components/context.jsonld", + "https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-optimize-rule-remove-false-conclusion/^1.0.0/components/context.jsonld", + "https://linkedsoftwaredependencies.org/bundles/npm/@comunica/actor-optimize-rule-pattern-restriction/^1.0.0/components/context.jsonld" +], "@id": "urn:comunica:default:Runner", "@type": "Runner", "actors": [ @@ -11,7 +13,8 @@ }, { "@id": "urn:comunica:default:optimize-rule/actors#pattern-restriction", - "@type": "ActorOptimizeRulePatternRestriction" + "@type": "ActorOptimizeRulePatternRestriction", + "beforeActors": { "@id": "urn:comunica:default:optimize-rule/actors#remove-false-conclusion" } } ] } diff --git a/engines/config-reasoning/config/reasoning-default.json b/engines/config-reasoning/config/reasoning-default.json index f25b55a22..d6d164ac5 100644 --- a/engines/config-reasoning/config/reasoning-default.json +++ b/engines/config-reasoning/config/reasoning-default.json @@ -5,6 +5,7 @@ "import": [ "ccr:config/normalize-rule/mediators.json", "ccr:config/optimize-rule/mediators.json", + "ccr:config/optimize-rule/actors.json", "ccr:config/rule-parse/actors.json", "ccr:config/rule-parse/mediators.json", "ccr:config/dereference-rule/actors.json", diff --git a/engines/config-reasoning/package.json b/engines/config-reasoning/package.json index b7b83daf7..0e431fcbd 100644 --- a/engines/config-reasoning/package.json +++ b/engines/config-reasoning/package.json @@ -39,7 +39,5 @@ }, "dependencies": { "@comunica/config-query-sparql": "^2.0.1" - }, - "devDependencies": { } } diff --git a/engines/query-sparql-file-reasoning/package.json b/engines/query-sparql-file-reasoning/package.json index a655e87ee..cf96495f7 100644 --- a/engines/query-sparql-file-reasoning/package.json +++ b/engines/query-sparql-file-reasoning/package.json @@ -28,9 +28,9 @@ ], "license": "MIT", "bin": { + "comunica-dynamic-sparql": "bin/query-dynamic.js", "comunica-sparql": "bin/query.js", - "comunica-sparql-http": "bin/http.js", - "comunica-dynamic-sparql": "bin/query-dynamic.js" + "comunica-sparql-http": "bin/http.js" }, "bugs": { "url": "https://github.com/comunica/comunica-feature-reasoning/issues" diff --git a/engines/query-sparql-reasoning/package.json b/engines/query-sparql-reasoning/package.json index c66d677c9..f59a67b4c 100644 --- a/engines/query-sparql-reasoning/package.json +++ b/engines/query-sparql-reasoning/package.json @@ -27,9 +27,9 @@ ], "license": "MIT", "bin": { + "comunica-dynamic-sparql": "bin/query-dynamic.js", "comunica-sparql": "bin/query.js", - "comunica-sparql-http": "bin/http.js", - "comunica-dynamic-sparql": "bin/query-dynamic.js" + "comunica-sparql-http": "bin/http.js" }, "bugs": { "url": "https://github.com/comunica/comunica-feature-reasoning/issues" diff --git a/package.json b/package.json index 8da99da10..401826b54 100644 --- a/package.json +++ b/package.json @@ -114,9 +114,9 @@ "test-ci": "jest --ci --maxWorkers=4 --coverage", "lint": "eslint . --ext .ts --cache", "clean": "rm -rf ./node_modules && rm -rf ./packages/*/node_modules", - "build": "npm run build:ts && npm run build:components", + "build": "yarn run build:ts && yarn run build:components", "build:ts": "tsc", - "build:components": "componentsjs-generator engines/* packages/*", + "build:components": "lerna exec -- npm run build:components --if-present", "build-watch": "nodemon -e ts --ignore '*.d.ts' --exec yarn run build", "build-watch:ts": "tsc --watch", "build-watch:components": "nodemon -e d.ts --exec yarn run build:components", @@ -128,9 +128,7 @@ "postinstall": "yarn run build && lerna run prepare", "version": "manual-git-changelog onversion", "depcheck": "lerna-script depcheckTask", - "depcheck:fix": "lerna-script depfixTask", - "build:engine": "yarn run build:engine:sparql-reasoning", - "build:engine:sparql-reasoning": "(cd engines && comunica-package -c config-reasoning/config/config-default.json -o query-sparql-reasoning)" + "depcheck:fix": "lerna-script depfixTask" }, "resolutions": { "@rdfjs/types": "1.1.0" diff --git a/packages/actor-dereference-rule-parse/package.json b/packages/actor-dereference-rule-parse/package.json index 6d5cc504b..66e3f05e5 100644 --- a/packages/actor-dereference-rule-parse/package.json +++ b/packages/actor-dereference-rule-parse/package.json @@ -39,6 +39,5 @@ "build": "npm run build:ts && npm run build:components", "build:ts": "node \"../../node_modules/typescript/bin/tsc\"", "build:components": "componentsjs-generator" - }, - "devDependencies": {} + } } diff --git a/packages/actor-optimize-rule-pattern-restriction/lib/ActorOptimizeRulePatternRestriction.ts b/packages/actor-optimize-rule-pattern-restriction/lib/ActorOptimizeRulePatternRestriction.ts index 81b7efc15..25cbe0589 100644 --- a/packages/actor-optimize-rule-pattern-restriction/lib/ActorOptimizeRulePatternRestriction.ts +++ b/packages/actor-optimize-rule-pattern-restriction/lib/ActorOptimizeRulePatternRestriction.ts @@ -18,8 +18,6 @@ export class ActorOptimizeRulePatternRestriction extends ActorOptimizeRule { } public async test(action: IActionOptimizeRule): Promise { - // Console.log(action) - const { pattern } = action; if (!pattern) { @@ -101,16 +99,15 @@ IPremiseConclusionRule[] { * @param pattern A pattern - possibly containing variables * @param quad A quad - possibly containing variables */ -export function matchPatternMappings(pattern: RDF.Quad | Algebra.Pattern, quad: RDF.Quad): boolean { +export function matchPatternMappings(pattern: RDF.Quad | Algebra.Pattern, quad: Algebra.Pattern | RDF.Quad): boolean { const mapping: Record = {}; const res = everyTerms(pattern, (term, key) => { - if (term.termType !== 'Variable') { + if (quad[key].termType === 'Variable') + return true; + if (term.termType !== "Variable") return term.equals(quad[key]); - } // eslint-disable-next-line no-return-assign - return quad[key].termType === 'Variable' || (term.value in mapping ? - mapping[term.value].equals(quad[key]) : - (mapping[term.value] = quad[key]) && true); + return (term.value in mapping ? mapping[term.value].equals(quad[key]) : (mapping[term.value] = quad[key]) && true); }); return res; } diff --git a/packages/actor-optimize-rule-pattern-restriction/package.json b/packages/actor-optimize-rule-pattern-restriction/package.json index 324b3c4d7..7fb3bbb32 100644 --- a/packages/actor-optimize-rule-pattern-restriction/package.json +++ b/packages/actor-optimize-rule-pattern-restriction/package.json @@ -31,8 +31,8 @@ ], "dependencies": { "@comunica/bus-optimize-rule": "^1.0.0", - "@comunica/reasoning-types": "^1.0.0", "@comunica/core": "^2.0.1", + "@comunica/reasoning-types": "^1.0.0", "@rdfjs/types": "*", "asynciterator": "^3.4.0", "rdf-terms": "^1.7.1", diff --git a/packages/actor-optimize-rule-pattern-restriction/test/ActorOptimizeRulePatternRestriction-test.ts b/packages/actor-optimize-rule-pattern-restriction/test/ActorOptimizeRulePatternRestriction-test.ts index a2c2187a3..5db51e0cf 100644 --- a/packages/actor-optimize-rule-pattern-restriction/test/ActorOptimizeRulePatternRestriction-test.ts +++ b/packages/actor-optimize-rule-pattern-restriction/test/ActorOptimizeRulePatternRestriction-test.ts @@ -186,5 +186,71 @@ describe('ActorOptimizeRulePatternRestriction', () => { ) }); expect(await rules.toArray()).toHaveLength(2); }); + + it('should work with default graph rule', async() => { + const { rules } = await actor.run({ context: new ActionContext(), + rules: fromArray([ + { + ruleType: 'premise-conclusion', + premise: [ DF.quad( + DF.variable('s'), + DF.namedNode('a'), + DF.variable('o'), + DF.defaultGraph(), + ), DF.quad( + DF.variable('o'), + DF.namedNode('subClassOf'), + DF.variable('o2'), + DF.defaultGraph(), + ) ], + conclusion: [ DF.quad( + DF.variable('s'), + DF.namedNode('a'), + DF.variable('o2'), + DF.defaultGraph(), + ) ], + }, + ]), + pattern: factory.createPattern( + DF.variable('s'), + DF.variable('p'), + DF.variable('o'), + DF.variable('g'), + ) }); + expect(await rules.toArray()).toHaveLength(1); + }); + + it('should work with default graph rule and using restricted pattern', async() => { + const { rules } = await actor.run({ context: new ActionContext(), + rules: fromArray([ + { + ruleType: 'premise-conclusion', + premise: [ DF.quad( + DF.variable('s'), + DF.namedNode('a'), + DF.variable('o'), + DF.defaultGraph(), + ), DF.quad( + DF.variable('o'), + DF.namedNode('subClassOf'), + DF.variable('o2'), + DF.defaultGraph(), + ) ], + conclusion: [ DF.quad( + DF.variable('s'), + DF.namedNode('a'), + DF.variable('o2'), + DF.defaultGraph(), + ) ], + }, + ]), + pattern: factory.createPattern( + DF.namedNode('Jesse'), + DF.namedNode('a'), + DF.variable('o'), + DF.variable('g'), + ) }); + expect(await rules.toArray()).toHaveLength(1); + }); }); }); diff --git a/packages/actor-rdf-reason-rule-restriction/package.json b/packages/actor-rdf-reason-rule-restriction/package.json index c4f801ef9..9303fd463 100644 --- a/packages/actor-rdf-reason-rule-restriction/package.json +++ b/packages/actor-rdf-reason-rule-restriction/package.json @@ -31,8 +31,8 @@ ], "dependencies": { "@comunica/bus-rdf-reason": "^1.0.0", - "@comunica/reasoning-context-entries": "^1.0.0", "@comunica/core": "^2.0.0", + "@comunica/reasoning-context-entries": "^1.0.0", "@comunica/reasoning-types": "^1.0.0", "@rdfjs/types": "*", "asynciterator": "3.4.0", diff --git a/packages/actor-rule-parse-hylar/package.json b/packages/actor-rule-parse-hylar/package.json index 1bb4ad217..5ac32b7a5 100644 --- a/packages/actor-rule-parse-hylar/package.json +++ b/packages/actor-rule-parse-hylar/package.json @@ -43,6 +43,5 @@ "build": "npm run build:ts && npm run build:components", "build:ts": "node \"../../node_modules/typescript/bin/tsc\"", "build:components": "componentsjs-generator" - }, - "devDependencies": {} + } } diff --git a/packages/actor-rule-resolve-hypermedia/package.json b/packages/actor-rule-resolve-hypermedia/package.json index 6fb61225e..f4420806a 100644 --- a/packages/actor-rule-resolve-hypermedia/package.json +++ b/packages/actor-rule-resolve-hypermedia/package.json @@ -31,12 +31,12 @@ ], "dependencies": { "@comunica/bus-dereference-rule": "^1.0.0", - "@comunica/reasoning-types": "^1.0.0", "@comunica/bus-http-invalidate": "^2.0.0", "@comunica/bus-rule-resolve": "^1.0.0", "@comunica/core": "^2.0.0", - "@comunica/types": "^2.0.0", "@comunica/reasoning-context-entries": "^1.0.0", + "@comunica/reasoning-types": "^1.0.0", + "@comunica/types": "^2.0.0", "@types/lru-cache": "^5.1.0", "asynciterator": "^3.4.0", "lru-cache": "^6.0.0" diff --git a/packages/bus-rdf-reason/package.json b/packages/bus-rdf-reason/package.json index 82ebc1711..8d7a14cfc 100644 --- a/packages/bus-rdf-reason/package.json +++ b/packages/bus-rdf-reason/package.json @@ -30,13 +30,13 @@ ], "dependencies": { "@comunica/bus-optimize-rule": "^1.0.0", - "@comunica/reasoning-types": "^1.0.0", - "@comunica/reasoning-context-entries": "^1.0.0", "@comunica/bus-rdf-resolve-quad-pattern": "^2.0.0", "@comunica/bus-rdf-update-quads": "^2.0.0", "@comunica/bus-rule-resolve": "^1.0.0", "@comunica/context-entries": "^2.0.0", "@comunica/core": "^2.0.0", + "@comunica/reasoning-context-entries": "^1.0.0", + "@comunica/reasoning-types": "^1.0.0", "@comunica/types": "^2.0.0", "@rdfjs/types": "*", "asynciterator": "^3.4.0", @@ -47,6 +47,5 @@ "build": "npm run build:ts && npm run build:components", "build:ts": "node \"../../node_modules/typescript/bin/tsc\"", "build:components": "componentsjs-generator" - }, - "devDependencies": {} + } } diff --git a/packages/reasoning-mocks/package.json b/packages/reasoning-mocks/package.json index 99043c10d..2daaf3b1c 100644 --- a/packages/reasoning-mocks/package.json +++ b/packages/reasoning-mocks/package.json @@ -34,17 +34,15 @@ "@comunica/bus-rdf-parse": "^2.0.1", "@comunica/bus-rdf-reason": "^1.0.0", "@comunica/context-entries": "^2.0.1", - "@comunica/reasoning-context-entries": "^1.0.0", "@comunica/core": "^2.0.1", + "@comunica/reasoning-context-entries": "^1.0.0", "@comunica/reasoning-types": "^1.0.0", "@rdfjs/types": "*", "asynciterator": "^3.4.0", "n3": "^1.16.0" }, "scripts": { - "build": "npm run build:ts && npm run build:components", - "build:ts": "node \"../../node_modules/typescript/bin/tsc\"", - "build:components": "componentsjs-generator" + "build": "node \"../../node_modules/typescript/bin/tsc\"" }, "devDependencies": { "@types/n3": "^1.10.4", diff --git a/packages/reasoning-types/package.json b/packages/reasoning-types/package.json index 22d8f4475..bf79f0ceb 100644 --- a/packages/reasoning-types/package.json +++ b/packages/reasoning-types/package.json @@ -32,8 +32,6 @@ "@rdfjs/types": "*" }, "scripts": { - "build": "npm run build:ts && npm run build:components", - "build:ts": "node \"../../node_modules/typescript/bin/tsc\"", - "build:components": "componentsjs-generator" + "build": "node \"../../node_modules/typescript/bin/tsc\"" } }