ucbl / HyLAR-Reasoner

HyLAR reasoner
https://www.npmjs.com/package/hylar
MIT License
61 stars 13 forks source link

add an rule but no new tripples #11

Closed crapthings closed 6 years ago

crapthings commented 6 years ago
const fs = require('fs')
const Hylar = require('hylar')
const h = new Hylar()
const file = fs.readFileSync('./kg.ttl', { encoding: 'utf-8' })

const PREFIX = IRI => `http://un.jong.kim/onto#${IRI}`

async function test() {
  const kg = await h.load(file, 'text/turtle')
  h.parseAndAddRule(`(?x http://un.jong.kim#hasChild ?y) ^ (?y http://un.jong.kim/onto#hasChild ?z) -> (?x http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://un.jong.kim/onto#GrandFather)`, 'R1')
  const test = await squery(`select * where { ?s ?p ?o . }`)
  console.log(test)
}

test()

async function squery(q) {
  return await h.query(`
    PREFIX : <http://un.jong.kim/onto#>
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    ${q}
  `)
}
mterdjimi commented 6 years ago

Hello, Could you please send me the file kg.ttl you are using to populate the store ?

Thanks !

crapthings commented 6 years ago
const fs = require('fs')
const Hylar = require('hylar')
const h = new Hylar()
const file = fs.readFileSync('./kg.ttl', { encoding: 'utf-8' })

const PREFIX = IRI => `http://un.jong.kim/onto#${IRI}`

async function test() {
  h.parseAndAddRule(`(?x http://un.jong.kim#hasChild ?y) ^ (?y http://un.jong.kim/onto#hasChild ?z) -> (?x http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://un.jong.kim/onto#GrandFather)`, 'R1')
  const kg = await h.load(file, 'text/turtle')
  const test = await squery(`select * where { ?s ?p :GrandFather . }`)
  console.log(test)
}

test()

async function squery(q) {
  return await h.query(`
    PREFIX : <http://un.jong.kim/onto#>
    ${q}
  `)
}
@prefix : <http://un.jong.kim/onto#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://un.jong.kim/onto> .

<http://un.jong.kim/onto> rdf:type owl:Ontology .

#################################################################
#    Object Properties
#################################################################

###  http://un.jong.kim/onto#hasChild
:hasChild rdf:type owl:ObjectProperty .

#################################################################
#    Classes
#################################################################

###  http://un.jong.kim/onto#GrandFather
:GrandFather rdf:type owl:Class .

#################################################################
#    Individuals
#################################################################

###  http://un.jong.kim/onto#A
:A rdf:type owl:NamedIndividual ;
   :hasChild :B .

###  http://un.jong.kim/onto#B
:B rdf:type owl:NamedIndividual ;
   :hasChild :C .

###  http://un.jong.kim/onto#C
:C rdf:type owl:NamedIndividual .

###  Generated by the OWL API (version 4.2.8.20170104-2310) https://github.com/owlcs/owlapi
mterdjimi commented 6 years ago

Looking at your data, it seems that you wrote http://un.jong.kim#hasChild instead of http://un.jong.kim/onto#hasChild in your first rule pattern. Hence, the rule cannot be fired.

Could you try with

h.parseAndAddRule(`(?x http://un.jong.kim/onto#hasChild ?y) ^ (?y http://un.jong.kim/onto#hasChild ?z) -> (?x http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://un.jong.kim/onto#GrandFather)`, 'R1')

please ? Thanks !

crapthings commented 6 years ago

and it looks like h.parseAndAddRule should put before h.load

mterdjimi commented 6 years ago

This is right; currently, adding a rule does not reconsider the inferences. This should be fixed in the next version of HyLAR.

Ps: you can also simply state in your schema that hasFather is an owl:transitiveProperty, as HyLAR supports transitivity without adding any specific rule.