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"