- From: Rui Zhao <rui.zhao@cs.ox.ac.uk>
- Date: Sun, 27 Aug 2023 16:02:25 +0000
- To: "public-rdfsurfaces@w3.org" <public-rdfsurfaces@w3.org>
Hi, It’s very excited to see a reasoning mechanism with first-order logic capacity, on top of N3. RDF Surfaces got me very interesting, and I started to carefully learn it recently. I have read through the document, and a couple of examples in the repository. I have managed to encode most of my axioms using RDF Surfaces. However, I’m still having some difficulties on handling predicates with multiple objects. As an example, I would like to express the following formula: \forall X. A(X) —> \exists Y. (B(Y, X) /\ \forall Z. C(X, Z) —> D(Y, Z)) The intuitive meaning is: for any A(X), we always have a Y such that B(Y, X); and if we have C(X, Z) for that X, we also have D(Y, Z) for that Y. My ABox originally only contains statements of A(X) and C(X, Z), and I want to use reasoner to derive information about Ys. Hope I didn’t make anything wrong with the logical formula. I tried to encode it using RDF Surfaces, and ended up with a series of nested negative surfaces, reflecting the following equivalent formula: NOT \exists X. (A(X) /\ NOT \exists Y. (B(Y, X) /\ NOT \exists Z. (C(X, Z) /\ NOT D(Y, Z))) For example, the following code illustrates my test case: ``` @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. @prefix log: <http://www.w3.org/2000/10/swap/log#>. @prefix : <http://example.org/ns#>. :a a :Man. :a :knows :b. (_:x) log:onNegativeSurface { _:x a :Man. (_:y) log:onNegativeSurface { _:y a :Community; :contains _:x. (_:z) log:onNegativeSurface { _:x :knows _:z. () log:onNegativeSurface { _:y :contains _:z. }. }. }. }. (_:s _:p _:o) log:onQuerySurface { _:s _:p _:o. }. ``` I executed it with `eye --quiet --nope --blogic test-nested-neg2.n3s`. Result is: ``` _:sk_21 a :Community. _:sk_21 :contains :a. _:sk_23 :contains :b. _:sk_24 :contains :c. ``` (Other lines removed for clarify.) However, what I’m expecting is that the same :Community has all :a, :b and :c -- something like this: ``` _:sk_21 a :Community. _:sk_21 :contains :a. _:sk_21 :contains :b. _:sk_21 :contains :c. ``` Did I understand the semantics of RDF Surfaces incorrectly? How should I correctly express my formula? In particular, I think I may misunderstand something here: https://w3c-cg.github.io/rdfsurfaces/#Surface. It talks about the (co)reference of blank nodes, which says “...as coreferences to the blank node graffiti defined on a parent RDF Surface”. The “a parent” is a bit ambiguous to me. I understand this as “ (surfaces are nested as a tree, and) go up the surface tree branch from the current node/leaf, and find the nearest ancestor surface which contains a blank node with the same name (and use it)“. Is that correct? Any suggestion is appreciated. Best, Rui
Received on Monday, 28 August 2023 15:32:44 UTC