I'm thinking of joining the group, but I'm confused by the statement on the group's home page: > The RDF Surfaces sets out to create a sublanguage of Notation3 in order to implement classical first-order logic with negation in RDF as envisioned by Pat Hayes in his 2009 ISWC Invited Talk: BLOGIC Is the goal of the group to just implement FOL in RDF or is it to create some N3 notation for RDF surfaces? These two seem very different to me. peter

Dear all This is a reminder we have a new W3C RDF Surfaces call on Wed September 27 16:00-17:00 CEST. If you want to join the online meeting please send me a personal email message for the connection details. BR Patrick Hochstenbach

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