Hello Andy, yes, when I am in trouble I use your same strategy to inspect the result with SELECT first, and then build the graph with a CONSTRUCT. In this case I had a misconception that was in the query writing itself
The query that is working for me, of course, as the same writing as yours, plus some customization for my case. About thecode:nff (that is a made up code resource) for the ?ref2 in g2, I double checked the attachement g2.n3 and there is a triple "code:nff code:classifies ce:1221-32" code:nff code:classifies ce:1221-32 and code:cca code:classifies ce:5541-32 are not in g1 hence both are expected in g_result. See, the whole point of my query is that the ?ce are different between g1 and g2 when they are related (code:classifies) to the same ?code. I can apply the filtering conditions only on the ?code since I find them equals when they belong in both graphs. Am I missing something of your question? PS: I wish to refer this solution in answers.semanticweb and give credit to Joshua. How can we On Thursday, May 15, 2014 9:18 PM, Andy Seaborne <[email protected]> wrote: It's much easier to work with SELECT to getthe right variables, then add the CONSTRUCT. prefix code: <http://example.org/code/> prefix ce: <http://example.org/codedentity/> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT * FROM NAMED <g1.n3> FROM NAMED <g2.n3> { GRAPH <g2.n3> { ?code code:classifies ?ref1 } FILTER NOT EXISTS { GRAPH <g1.n3> { ?code code:classifies ?ref2 } } } I still not sure what you mean by "code" but if we're ignoring the ce: classifier then the query above returns: ------------------------- | code | ref1 | ========================= | code:cca | ce:5541-32 | | code:nff | ce:1221-32 | ------------------------- so that gets the ?code Add a CONSTRUCT: prefix code: <http://example.org/code/> prefix ce: <http://example.org/codedentity/> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> CONSTRUCT { ?code ?p ?x . ?ce2 ?r ?y . } FROM NAMED <g1.n3> FROM NAMED <g2.n3> { GRAPH <g2.n3> { ?code2 code:classifies ?ref } FILTER NOT EXISTS { GRAPH <g1.n3> { ?code1 code:classifies ?ref } } # Look again to get the data needed for the construct template. GRAPH <g2.n3> { ?code code:classifies ?ce2 . ?ce2 ?r ?y. ?code ?p ?x } } --------------------------------------------- @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix code: <http://example.org/code/> . @prefix ce: <http://example.org/codedentity/> . code:cca code:classifies ce:5541-32 . ce:1221-32 rdfs:label "1221-32" . code:nff code:classifies ce:1221-32 . ce:5541-32 rdfs:label "5541-32" . --------------------------------------------- I don't see why "nff" should be in the results. We have: ce:nff rdfs:label "nff" . but ce:nff isn't connected to a triple with code:classifies -- are the code:nff and ce:nff mixed up? Andy On 14/05/14 15:52, Leo Papa wrote: > Hello fellas, > > I am trying to make my mind around this issue and I still cannot figure > it out. > > I have Graph g1 (g1.n3 attached) and Graph g2 (g2.n3 attached), where g2 > has the same structure of g1 and share a subset of entities (CODE) > - (code1, code2) in g1 > - (code1, code2, code3, code4) in g2 > > I create Jena DatasetGraph with g1 and g2 and a query (query.txt attached) > || > |DatasetGraph dsg = DatasetGraphFactory.createMem(); > | > |dsg.addGraph("http://example.org/g1", g1); > | > |dsg.addGraph("http://example.org/g2" g2); > | > |QueryExecutionFactory.create(query,||DatasetFactory.create(dsg)).execConstruct().getGraph();| > I want to achieve a query result that CONSTRUCT the graph/model > constraining on the CODEs in g2 that are not in g1, hence: > |CONSTRUCT { ?codeG2 ?p ?x . ?ce2 ?r ?y . } > | > |WHERE > | > |{ GRAPH <http://example.org/g1> <http://example.org/g1%3E> > | > |{ ?codeG1 <http://example.org/code/classifies> > <http://example.org/code/classifies%3E> ?ce1} > | > |GRAPH <http://example.org/g2> <http://example.org/g2%3E> > | > |{ ?codeG2 <http://example.org/code/classifies> > <http://example.org/code/classifies%3E> ?ce2 . > | > |?ce2 ?r ?y. ?codeG2 ?p ?x } > | > |FILTER(?codeG2 != ?codeG1) > } > | > > The result I expect should be (g_result.n3 attached): > |*/Graph: http://example.org/result/* > | > |@prefix code: <http://example.org/code/> <http://example.org/code/%3E> . > | > |@prefix ce: <http://example.org/codedentity/> > <http://example.org/codedentity/%3E> . > | > |@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> > <http://www.w3.org/2000/01/rdf-schema#%3E> .| > | > code:nff code:classifies ce:1221-32. > ce:nff rdfs:label "nff" . > ce:1221-32 rdfs:label "1221-32" . > code:nff a code:Code. > | > |code:cca code:classifies ce:5541-32. > | > |ce:cca rdfs:label "cca" . > | > |ce:5541-32 rdfs:label "5541-32" .||code:cca a code:Code. | > > Instead of the expected/wanted result I have a graph that contains the > correct CONSTRUCT pattern, but does not FILTER according the condition. > What's more weird is that the filter will work for (?codeG2 = ?codeG1) > but not the !=. > Where am I doing it wrong? Someone can try to test this? > > Thanks a lot > | > | >
