Allegrograph——类似RDF对象属性的函子



使用Allegrograph, Prolog函子非常棒,但有一个缺点。

假设你定义了一个连接两个实体的函子,例如parentOf等于"!n:motherOf OR !n:fatherOf"它们都是本体中定义的rdf对象属性(不是函子)。

让我们定义三联体"A "!护士:fatherOf B"。因为"parentOf"是一个函子而不是一个rdf对象属性,如果您请求链接a和B的所有属性,您将只获得三元组" a !n:fatherOf B"(但不是"A parent B")。

知道A是否是B的父节点的唯一方法是直接问布尔问题。

所以我的问题是:如何轻松获得"获得由函子生成的FACTS +推断事实组成的RDF三元组"的结果?

Prolog函子是Prolog程序的一部分。当你使用Prolog在AllegroGraph存储上编写查询时,你实际上是在编写一个Prolog程序,该程序对程序中表达的约束条件派生出一组答案。

parentOf不是store的一部分,而是程序的一部分。

你要做的是物化 Prolog程序隐含的知识,这样它就可以以与基本三元组相同的形式使用。

要做到这一点,你需要编写一个…Prolog程序来派生推断的知识并将其添加到存储中。

这里有一些代码应该会有所帮助。这是Lisp中的一些设置和示例,但Prolog函子应该是显而易见的。

;; Assume the prefix is set up. These are for the Lisp environment.
(register-namespace "ex" "http://example.com/")
(enable-!-reader)
;; Define functors for basic relationships.
(<-- (parent ?x ?y)  
     (father ?x ?y))  
(<- (parent ?x ?y)  
    (mother ?x ?y))  
(<-- (male ?x)  
     (q- ?x !ex:sex !ex:male))  
(<-- (female ?x)  
     (q- ?x !ex:sex !ex:female))  
(<-- (father ?x ?y)  
     (male ?x)  
     (q- ?x !ex:has-child ?y))  
(<-- (mother ?x ?y)  
     (female ?x)  
     (q- ?x !ex:has-child ?y)) 
;; Functors for adding triples.
(<-- (a- ?s ?p ?o)
 ;; Fails unless all parts ground.
 (lisp (add-triple ?s ?p ?o)))
(<-- (a- ?s ?p ?o ?g)
 ;; Fails unless all parts ground.
 (lisp (add-triple ?s ?p ?o ?g)))
(<-- (a-- ?s ?p ?o)
 ;; Fails unless all parts ground.
 (lispp (not (get-triple :s ?s :p ?p :o ?o)))
 (lisp (add-triple ?s ?p ?o)))
(<-- (a-- ?s ?p ?o ?g)
 ;; Fails unless all parts ground.
 (lispp (not (get-triple :s ?s :p ?p :o ?o :g ?g)))
 (lisp (add-triple ?s ?p ?o ?g)))
;; Add some sample data.
(create-triple-store "/tmp/foo")
(add-triple !ex:john !ex:sex !ex:male)
(add-triple !ex:dave !ex:sex !ex:male)
(add-triple !ex:alice !ex:sex !ex:female)
(add-triple !ex:alice !ex:has-child !ex:dave)
(add-triple !ex:john !ex:has-child !ex:dave)
;; Now who is a parent of whom?
(select (?parent ?child)
  (parent ?parent ?child))
;; Returns:
;; (("http://example.com/john" "http://example.com/dave")
;;  ("http://example.com/alice" "http://example.com/dave"))
;; Add the triples.
(select (?parent ?child)    ; never succeeds
  (parent ?parent ?child)
  (a-- ?parent !ex:parentOf ?child)
  (fail))
;; Now see what's in the store using the materialized triples.
(select (?parent ?child)
  (q- ?parent !ex:parentOf ?child))
;; Returns:
;; (("http://example.com/john" "http://example.com/dave")
;;  ("http://example.com/alice" "http://example.com/dave"))

你想要这样的东西吗?

(<-- (parentOf ?a ?b)
    (or
        (q ?a !n:fatherOf ?b)
        (q ?a !n:motherOf ?b)))
(select (?a ?b)
    (parentOf ?a ?b))

select语句将返回包含n:fatherOf或n:motherOf的三元组。

相关内容

  • 没有找到相关文章

最新更新