From d8c6d5239af8275db88094885e33f7bfa18d1f76 Mon Sep 17 00:00:00 2001 From: Gunnar Aastrand Grimnes Date: Wed, 15 Feb 2017 11:15:29 +0100 Subject: [PATCH 1/4] added tests for issue #714 --- test/DAWG/rdflib/bnode-ppath-mix-a.rq | 11 +++ test/DAWG/rdflib/bnode-ppath-mix-b.rq | 11 +++ test/DAWG/rdflib/bnode-ppath-mix-c.rq | 14 +++ test/DAWG/rdflib/bnode-ppath-mix-d.rq | 13 +++ test/DAWG/rdflib/bnode-ppath-mix-e.rq | 13 +++ test/DAWG/rdflib/bnode-ppath-mix-f.rq | 15 ++++ test/DAWG/rdflib/bnode-ppath-mix-g.rq | 15 ++++ test/DAWG/rdflib/bnode-ppath-mix-h.rq | 15 ++++ test/DAWG/rdflib/bnode-ppath-mix.srx | 5 ++ test/DAWG/rdflib/bnode-ppath-mix.ttl | 22 +++++ test/DAWG/rdflib/manifest.ttl | 117 ++++++++++++++++++++++++++ 11 files changed, 251 insertions(+) create mode 100644 test/DAWG/rdflib/bnode-ppath-mix-a.rq create mode 100644 test/DAWG/rdflib/bnode-ppath-mix-b.rq create mode 100644 test/DAWG/rdflib/bnode-ppath-mix-c.rq create mode 100644 test/DAWG/rdflib/bnode-ppath-mix-d.rq create mode 100644 test/DAWG/rdflib/bnode-ppath-mix-e.rq create mode 100644 test/DAWG/rdflib/bnode-ppath-mix-f.rq create mode 100644 test/DAWG/rdflib/bnode-ppath-mix-g.rq create mode 100644 test/DAWG/rdflib/bnode-ppath-mix-h.rq create mode 100644 test/DAWG/rdflib/bnode-ppath-mix.srx create mode 100644 test/DAWG/rdflib/bnode-ppath-mix.ttl diff --git a/test/DAWG/rdflib/bnode-ppath-mix-a.rq b/test/DAWG/rdflib/bnode-ppath-mix-a.rq new file mode 100644 index 000000000..217836ee2 --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix-a.rq @@ -0,0 +1,11 @@ +prefix ex: +prefix in: +prefix rdf: +prefix rdfs: + +ask { + ?property + a rdf:Property; + rdfs:range/rdfs:subClassOf/rdfs:subClassOf ?classC; + rdfs:domain/rdfs:subClassOf/rdfs:subClassOf ?classF +} diff --git a/test/DAWG/rdflib/bnode-ppath-mix-b.rq b/test/DAWG/rdflib/bnode-ppath-mix-b.rq new file mode 100644 index 000000000..d09d85536 --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix-b.rq @@ -0,0 +1,11 @@ +prefix ex: +prefix in: +prefix rdf: +prefix rdfs: + +ask { + ?property + rdfs:range/rdfs:subClassOf/rdfs:subClassOf ?classC; + a rdf:Property; + rdfs:domain/rdfs:subClassOf/rdfs:subClassOf ?classF +} diff --git a/test/DAWG/rdflib/bnode-ppath-mix-c.rq b/test/DAWG/rdflib/bnode-ppath-mix-c.rq new file mode 100644 index 000000000..45a9dabbf --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix-c.rq @@ -0,0 +1,14 @@ +prefix ex: +prefix in: +prefix rdf: +prefix rdfs: + +ask { + ?property + rdfs:range + [ rdfs:subClassOf + [ rdfs:subClassOf ?classC ] + ]; + a rdf:Property ; + rdfs:domain ?classF . +} diff --git a/test/DAWG/rdflib/bnode-ppath-mix-d.rq b/test/DAWG/rdflib/bnode-ppath-mix-d.rq new file mode 100644 index 000000000..c6da64c4b --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix-d.rq @@ -0,0 +1,13 @@ +prefix ex: +prefix in: +prefix rdf: +prefix rdfs: + +ask { + ?property + rdfs:range/rdfs:subClassOf [ + rdfs:subClassOf ?classC + ]; + a rdf:Property; + rdfs:domain/rdfs:subClassOf/rdfs:subClassOf ?classF +} diff --git a/test/DAWG/rdflib/bnode-ppath-mix-e.rq b/test/DAWG/rdflib/bnode-ppath-mix-e.rq new file mode 100644 index 000000000..bd3dd6739 --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix-e.rq @@ -0,0 +1,13 @@ +prefix ex: +prefix in: +prefix rdf: +prefix rdfs: + +ask { + ?property + rdfs:range [ + rdfs:subClassOf/rdfs:subClassOf ?classC + ]; + a rdf:Property; + rdfs:domain/rdfs:subClassOf/rdfs:subClassOf ?classF +} diff --git a/test/DAWG/rdflib/bnode-ppath-mix-f.rq b/test/DAWG/rdflib/bnode-ppath-mix-f.rq new file mode 100644 index 000000000..362d36753 --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix-f.rq @@ -0,0 +1,15 @@ +prefix ex: +prefix in: +prefix rdf: +prefix rdfs: + +ask { + ?property + a rdf:Property ; + rdfs:range [ + rdfs:subClassOf/rdfs:subClassOf ?classC + ]; + rdfs:domain [ + rdfs:subClassOf/rdfs:subClassOf ?classF + ] +} diff --git a/test/DAWG/rdflib/bnode-ppath-mix-g.rq b/test/DAWG/rdflib/bnode-ppath-mix-g.rq new file mode 100644 index 000000000..a42148e78 --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix-g.rq @@ -0,0 +1,15 @@ +prefix ex: +prefix in: +prefix rdf: +prefix rdfs: + +ask { + ?property + rdfs:range [ + rdfs:subClassOf/rdfs:subClassOf ?classC + ] ; + a rdf:Property ; + rdfs:domain [ + rdfs:subClassOf/rdfs:subClassOf ?classF + ] . +} diff --git a/test/DAWG/rdflib/bnode-ppath-mix-h.rq b/test/DAWG/rdflib/bnode-ppath-mix-h.rq new file mode 100644 index 000000000..dd79d32b3 --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix-h.rq @@ -0,0 +1,15 @@ +prefix ex: +prefix in: +prefix rdf: +prefix rdfs: + +ask { + ?property + a rdf:Property; + rdfs:range [ + rdfs:subClassOf [ rdfs:subClassOf ?classC ] + ] ; + rdfs:domain [ + rdfs:subClassOf [ rdfs:subClassOf ?classF ] + ] +} diff --git a/test/DAWG/rdflib/bnode-ppath-mix.srx b/test/DAWG/rdflib/bnode-ppath-mix.srx new file mode 100644 index 000000000..174f2b76d --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix.srx @@ -0,0 +1,5 @@ + + + +true + diff --git a/test/DAWG/rdflib/bnode-ppath-mix.ttl b/test/DAWG/rdflib/bnode-ppath-mix.ttl new file mode 100644 index 000000000..b1a3c124e --- /dev/null +++ b/test/DAWG/rdflib/bnode-ppath-mix.ttl @@ -0,0 +1,22 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix ex: . +@prefix in: . + + +in:a rdf:type rdfs:Class; + rdfs:subClassOf in:b. + +in:b rdf:type rdfs:Class; + rdfs:subClassOf in:c. + +in:d rdf:type rdfs:Class; + rdfs:subClassOf in:e. + + +in:e rdf:type rdfs:Class; + rdfs:subClassOf in:f. + +ex:a rdf:type rdf:Property; + rdfs:range in:a; + rdfs:domain in:d. diff --git a/test/DAWG/rdflib/manifest.ttl b/test/DAWG/rdflib/manifest.ttl index 85ba2db52..bf3a4d1e4 100644 --- a/test/DAWG/rdflib/manifest.ttl +++ b/test/DAWG/rdflib/manifest.ttl @@ -32,6 +32,15 @@ :subqueryagg1 :subqueryagg2 + :bnode-ppath-mix-a + :bnode-ppath-mix-b + :bnode-ppath-mix-c + :bnode-ppath-mix-d + :bnode-ppath-mix-e + :bnode-ppath-mix-f + :bnode-ppath-mix-g + :bnode-ppath-mix-h + ) . @@ -246,3 +255,111 @@ From https://github.com/RDFLib/rdflib/issues/615, contributed by https://github. qt:data ] ; mf:result . + +:bnode-ppath-mix-a rdf:type mf:QueryEvaluationTest ; + mf:name "bnode-ppath-mix-a"; + rdfs:comment """ + From https://github.com/RDFLib/rdflib/issues/714, contributed by https://github.com/tiko-tiko +"""; + dawgt:approval dawgt:Approved ; + dawgt:approvedBy ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result + . + +:bnode-ppath-mix-b rdf:type mf:QueryEvaluationTest ; + mf:name "bnode-ppath-mix-b"; + rdfs:comment """ + From https://github.com/RDFLib/rdflib/issues/714, contributed by https://github.com/tiko-tiko +"""; + dawgt:approval dawgt:Approved ; + dawgt:approvedBy ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result + . + +:bnode-ppath-mix-c rdf:type mf:QueryEvaluationTest ; + mf:name "bnode-ppath-mix-c"; + rdfs:comment """ + From https://github.com/RDFLib/rdflib/issues/714, contributed by https://github.com/tiko-tiko +"""; + dawgt:approval dawgt:Approved ; + dawgt:approvedBy ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result + . + + +:bnode-ppath-mix-d rdf:type mf:QueryEvaluationTest ; + mf:name "bnode-ppath-mix-d"; + rdfs:comment """ + From https://github.com/RDFLib/rdflib/issues/714, contributed by https://github.com/tiko-tiko +"""; + dawgt:approval dawgt:Approved ; + dawgt:approvedBy ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result + . + + + +:bnode-ppath-mix-e rdf:type mf:QueryEvaluationTest ; + mf:name "bnode-ppath-mix-e"; + rdfs:comment """ + From https://github.com/RDFLib/rdflib/issues/714, contributed by https://github.com/tiko-tiko +"""; + dawgt:approval dawgt:Approved ; + dawgt:approvedBy ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result + . + + +:bnode-ppath-mix-f rdf:type mf:QueryEvaluationTest ; + mf:name "bnode-ppath-mix-f"; + rdfs:comment """ + From https://github.com/RDFLib/rdflib/issues/714, contributed by https://github.com/tiko-tiko +"""; + dawgt:approval dawgt:Approved ; + dawgt:approvedBy ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result + . + +:bnode-ppath-mix-g rdf:type mf:QueryEvaluationTest ; + mf:name "bnode-ppath-mix-g"; + rdfs:comment """ + From https://github.com/RDFLib/rdflib/issues/714, contributed by https://github.com/tiko-tiko +"""; + dawgt:approval dawgt:Approved ; + dawgt:approvedBy ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result + . + +:bnode-ppath-mix-h rdf:type mf:QueryEvaluationTest ; + mf:name "bnode-ppath-mix-h"; + rdfs:comment """ + From https://github.com/RDFLib/rdflib/issues/714, contributed by https://github.com/tiko-tiko +"""; + dawgt:approval dawgt:Approved ; + dawgt:approvedBy ; + mf:action + [ qt:query ; + qt:data ] ; + mf:result + . From a412a5bedd3d7278e9b3225f39b64cbdb3eb6de3 Mon Sep 17 00:00:00 2001 From: Gunnar Aastrand Grimnes Date: Wed, 15 Feb 2017 11:18:40 +0100 Subject: [PATCH 2/4] correct form of bnode-ppath-mix-c --- test/DAWG/rdflib/bnode-ppath-mix-c.rq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/DAWG/rdflib/bnode-ppath-mix-c.rq b/test/DAWG/rdflib/bnode-ppath-mix-c.rq index 45a9dabbf..9d812be51 100644 --- a/test/DAWG/rdflib/bnode-ppath-mix-c.rq +++ b/test/DAWG/rdflib/bnode-ppath-mix-c.rq @@ -10,5 +10,5 @@ ask { [ rdfs:subClassOf ?classC ] ]; a rdf:Property ; - rdfs:domain ?classF . + rdfs:domain/rdfs:subClassOf/rdfs:subClassOf ?classF . } From b12f72811ef9501ebabe832d197b6215170e0c70 Mon Sep 17 00:00:00 2001 From: Gunnar Aastrand Grimnes Date: Wed, 15 Feb 2017 12:12:13 +0100 Subject: [PATCH 3/4] SPARQL Parser: allow ObjectListPath for repeat properties https://www.w3.org/2013/sparql-errata#errata-query-3 --- rdflib/plugins/sparql/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdflib/plugins/sparql/parser.py b/rdflib/plugins/sparql/parser.py index 6c56b72d7..a8a4426b4 100644 --- a/rdflib/plugins/sparql/parser.py +++ b/rdflib/plugins/sparql/parser.py @@ -498,7 +498,7 @@ def _hexExpand(match): # [83] PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectListPath ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )* PropertyListPathNotEmpty = (VerbPath | VerbSimple) + ObjectListPath + ZeroOrMore( - ';' + Optional((VerbPath | VerbSimple) + ObjectList)) + ';' + Optional((VerbPath | VerbSimple) + ObjectListPath)) # [82] PropertyListPath ::= Optional(PropertyListPathNotEmpty) PropertyListPath = Optional(PropertyListPathNotEmpty) From 376213ffcdd6b65acd104ddaa34b272ae8656823 Mon Sep 17 00:00:00 2001 From: Gunnar Aastrand Grimnes Date: Thu, 16 Feb 2017 09:21:41 +0100 Subject: [PATCH 4/4] fixed expandTriples for nested bnodes --- rdflib/plugins/sparql/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdflib/plugins/sparql/parser.py b/rdflib/plugins/sparql/parser.py index a8a4426b4..eda40bf27 100644 --- a/rdflib/plugins/sparql/parser.py +++ b/rdflib/plugins/sparql/parser.py @@ -58,7 +58,7 @@ def expandTriples(terms): elif t == ';': if i+1 == len(terms) or terms[i+1] == ";" or terms[i+1] == ".": continue # this semicolon is spurious - res.append(res[-3]) + res.append(res[0]) elif isinstance(t, list): # BlankNodePropertyList # is this bnode the object of previous triples?