使用 Allegrograph ,Prolog仿函数非常棒,但有一个缺点。
假设您定义了一个链接两个实体的仿函数,例如 parentOf 等于“!n:motherOf OR !n:fatherOf “这两个都是在你的本体中定义的rdf对象属性(不是仿函数)。
让我们定义三元组“A !n:fatherOf B”。由于“ parentOf ”是一个仿函数而不是一个rdf对象属性,如果您请求所有链接A et B的属性,您将只获得三元组“A !n:fatherOf B“(但不是”父母B“)。
知道A是否是B的父亲的唯一方法是直接询问布尔问题。
所以我的问题是:有什么方法可以轻松获得“获取由仿函数生成的FACTS + INFERRED FACTS组成的RDF三元组的结果?”
答案 0 :(得分:2)
Prolog仿函数是Prolog计划的一部分。当您使用Prolog在AllegroGraph商店上编写查询时,您实际上正在编写一个Prolog程序,该程序可以获得程序中表达的约束的一组答案。
parentOf 不是商店的一部分,它是该计划的一部分。
您要做的是实现 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"))
答案 1 :(得分:0)
你想要这样的东西吗?
(<-- (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的三元组。