- 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