From 9289bb694fd226f2a2807494c4ad7c805afb054d Mon Sep 17 00:00:00 2001 From: bovlb <31326650+bovlb@users.noreply.github.com> Date: Tue, 15 Oct 2024 19:43:22 -0700 Subject: [PATCH 1/6] Update parser.py Fix SPARQL parsing bug --- rdflib/plugins/sparql/parser.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/rdflib/plugins/sparql/parser.py b/rdflib/plugins/sparql/parser.py index d2e9f2dee..68e6211ca 100644 --- a/rdflib/plugins/sparql/parser.py +++ b/rdflib/plugins/sparql/parser.py @@ -59,6 +59,7 @@ def expandTriples(terms: ParseResults) -> List[Any]: Expand ; and , syntax for repeat predicates, subjects """ # import pdb; pdb.set_trace() + last_subject, last_predicate = None, None # Used for ; and , try: res: List[Any] = [] if DEBUG: @@ -66,11 +67,11 @@ def expandTriples(terms: ParseResults) -> List[Any]: l_ = len(terms) for i, t in enumerate(terms): if t == ",": - res.extend([res[-3], res[-2]]) + res.extend([last_subject, last_predicate]) elif t == ";": if i + 1 == len(terms) or terms[i + 1] == ";" or terms[i + 1] == ".": continue # this semicolon is spurious - res.append(res[0]) + res.append(last_subject) elif isinstance(t, list): # BlankNodePropertyList # is this bnode the object of previous triples? @@ -78,14 +79,19 @@ def expandTriples(terms: ParseResults) -> List[Any]: res.append(t[0]) # is this a single [] ? if len(t) > 1: - res += t + res += t # Don't update last_subject/last_predicate # is this bnode the subject of more triples? if i + 1 < l_ and terms[i + 1] not in ".,;": + last_subject, last_predicate = t[0], None res.append(t[0]) elif isinstance(t, ParseResults): res += t.asList() elif t != ".": res.append(t) + if (len(res) % 3) == 1: + last_subject = t + elif (len(res) % 3) == 2: + last_predicate = t if DEBUG: print(len(res), t) if DEBUG: From 85f1ceb4e40a75b9b6090394e2bb866dc09b796a Mon Sep 17 00:00:00 2001 From: bovlb <31326650+bovlb@users.noreply.github.com> Date: Tue, 15 Oct 2024 19:44:40 -0700 Subject: [PATCH 2/6] Add test for bug fix --- test/test_sparql/test_translate_algebra.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/test_sparql/test_translate_algebra.py b/test/test_sparql/test_translate_algebra.py index 59e747f65..50a673d6d 100644 --- a/test/test_sparql/test_translate_algebra.py +++ b/test/test_sparql/test_translate_algebra.py @@ -329,3 +329,21 @@ def test_sparql_group_concat(): g = Graph() q = dict(g.query(query)) assert q[URIRef("http://example.org/pred")] == Literal("abc") + + +def test_sparql_blank_node_comma(): + """Tests if blank nodes separated by commas are correctly parsed""" + + query = """ + PREFIX : + + SELECT ?s WHERE { + ?s :hasIngredient [:name "chicken"], [:name "butter"] . + } LIMIT 10 + """ + + parseResults = parseQuery(query) + triples = parseResults[1]['where'].part[0].triples[0] + s_count = sum(1 for i in range(0, len(triples), 3) + if triples[i] == Variable('s')) + assert s_count == 2, f"Found ?s as subject {s_count} times, expected 2" From bcacc84d4baf958edb4162692a606153e338dc9f Mon Sep 17 00:00:00 2001 From: Gavin Matthews Date: Wed, 16 Oct 2024 02:48:36 +0000 Subject: [PATCH 3/6] Check imports --- test/test_sparql/test_translate_algebra.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_sparql/test_translate_algebra.py b/test/test_sparql/test_translate_algebra.py index 50a673d6d..a69d88459 100644 --- a/test/test_sparql/test_translate_algebra.py +++ b/test/test_sparql/test_translate_algebra.py @@ -12,7 +12,7 @@ import rdflib.plugins.sparql.algebra as algebra import rdflib.plugins.sparql.parser as parser -from rdflib import Graph, Literal, URIRef +from rdflib import Graph, Literal, URIRef, Variable from rdflib.plugins.sparql.algebra import translateAlgebra from test.data import TEST_DATA_DIR @@ -342,7 +342,7 @@ def test_sparql_blank_node_comma(): } LIMIT 10 """ - parseResults = parseQuery(query) + parseResults = parser.parseQuery(query) triples = parseResults[1]['where'].part[0].triples[0] s_count = sum(1 for i in range(0, len(triples), 3) if triples[i] == Variable('s')) From 0f5b8905cafc117d58b227f7cee1e72e394eb5ba Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 02:56:26 +0000 Subject: [PATCH 4/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- test/test_sparql/test_translate_algebra.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/test_sparql/test_translate_algebra.py b/test/test_sparql/test_translate_algebra.py index a69d88459..fe6d11cc0 100644 --- a/test/test_sparql/test_translate_algebra.py +++ b/test/test_sparql/test_translate_algebra.py @@ -343,7 +343,6 @@ def test_sparql_blank_node_comma(): """ parseResults = parser.parseQuery(query) - triples = parseResults[1]['where'].part[0].triples[0] - s_count = sum(1 for i in range(0, len(triples), 3) - if triples[i] == Variable('s')) + triples = parseResults[1]["where"].part[0].triples[0] + s_count = sum(1 for i in range(0, len(triples), 3) if triples[i] == Variable("s")) assert s_count == 2, f"Found ?s as subject {s_count} times, expected 2" From a2cf340c546decbfb6504cd5d65e008916d501d9 Mon Sep 17 00:00:00 2001 From: Gavin Matthews Date: Wed, 16 Oct 2024 02:59:04 +0000 Subject: [PATCH 5/6] style --- test/test_sparql/test_translate_algebra.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_sparql/test_translate_algebra.py b/test/test_sparql/test_translate_algebra.py index a69d88459..ec973cb97 100644 --- a/test/test_sparql/test_translate_algebra.py +++ b/test/test_sparql/test_translate_algebra.py @@ -342,8 +342,8 @@ def test_sparql_blank_node_comma(): } LIMIT 10 """ - parseResults = parser.parseQuery(query) - triples = parseResults[1]['where'].part[0].triples[0] + parse_results = parser.parseQuery(query) + triples = parse_results[1]['where'].part[0].triples[0] s_count = sum(1 for i in range(0, len(triples), 3) if triples[i] == Variable('s')) assert s_count == 2, f"Found ?s as subject {s_count} times, expected 2" From e287709edcf4c8f398b0a4f480da2c3d23a668d2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 03:02:43 +0000 Subject: [PATCH 6/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- test/test_sparql/test_translate_algebra.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/test_sparql/test_translate_algebra.py b/test/test_sparql/test_translate_algebra.py index ec973cb97..702509ebe 100644 --- a/test/test_sparql/test_translate_algebra.py +++ b/test/test_sparql/test_translate_algebra.py @@ -343,7 +343,6 @@ def test_sparql_blank_node_comma(): """ parse_results = parser.parseQuery(query) - triples = parse_results[1]['where'].part[0].triples[0] - s_count = sum(1 for i in range(0, len(triples), 3) - if triples[i] == Variable('s')) + triples = parse_results[1]["where"].part[0].triples[0] + s_count = sum(1 for i in range(0, len(triples), 3) if triples[i] == Variable("s")) assert s_count == 2, f"Found ?s as subject {s_count} times, expected 2"