Skip to content

Commit

Permalink
feat: refactor query methods to use more named params instead of keyw…
Browse files Browse the repository at this point in the history
…ord args (#156)
  • Loading branch information
noahgorstein authored Jul 10, 2023
1 parent 651c341 commit e1ee5a6
Showing 1 changed file with 151 additions and 12 deletions.
163 changes: 151 additions & 12 deletions stardog/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"""

import contextlib
from typing import TypedDict
from typing import Dict, List, Optional, TypedDict, Union

from . import content_types as content_types
from . import exceptions as exceptions
Expand Down Expand Up @@ -353,6 +353,11 @@ def __query(self, query, method, content_type=None, **kwargs):

# query bindings
bindings = kwargs.get("bindings", {})

# many of the query methods (select, ask, etc) set bindings to a
# default of None
if bindings is None:
bindings = {}
for k, v in bindings.items():
params["${}".format(k)] = v

Expand All @@ -366,7 +371,20 @@ def __query(self, query, method, content_type=None, **kwargs):

return r.json() if content_type == content_types.SPARQL_JSON else r.content

def select(self, query, content_type=content_types.SPARQL_JSON, **kwargs):
def select(
self,
query: str,
base_uri: Optional[str] = None,
limit: Optional[int] = None,
offset: Optional[int] = None,
timeout: Optional[int] = None,
reasoning: Optional[bool] = None,
bindings: Optional[Dict[str, str]] = None,
content_type: str = content_types.SPARQL_JSON,
default_graph_uri: Optional[List[str]] = None,
named_graph_uri: Optional[List[str]] = None,
**kwargs,
) -> Union[str, Dict]:
"""Executes a SPARQL select query.
Args:
Expand All @@ -379,7 +397,7 @@ def select(self, query, content_type=content_types.SPARQL_JSON, **kwargs):
reasoning (bool, optional): Enable reasoning for the query
bindings (dict, optional): Map between query variables and their
values
content_type (str, optional): Content type for results.
content_type (str): Content type for results.
Defaults to 'application/sparql-results+json'
default_graph_uri (str, list[str], optional): URI(s) to be used as the default graph (equivalent to FROM)
named_graph_uri (str, list[str], optional): URI(s) to be used as named graphs (equivalent to FROM NAMED)
Expand All @@ -399,9 +417,35 @@ def select(self, query, content_type=content_types.SPARQL_JSON, **kwargs):
>>> conn.select('select * {?s ?p ?o}', bindings={'o': '<urn:a>'})
"""
return self.__query(query, "query", content_type=content_type, **kwargs)
return self.__query(
query=query,
method="query",
content_type=content_type,
base_uri=base_uri,
limit=limit,
offset=offset,
timeout=timeout,
reasoning=reasoning,
bindings=bindings,
default_graph_uri=default_graph_uri,
named_graph_uri=named_graph_uri,
**kwargs,
)

def graph(self, query, content_type=content_types.TURTLE, **kwargs):
def graph(
self,
query: str,
base_uri: Optional[str] = None,
limit: Optional[int] = None,
offset: Optional[int] = None,
timeout: Optional[int] = None,
reasoning: Optional[bool] = None,
bindings: Optional[Dict[str, str]] = None,
content_type=content_types.TURTLE,
default_graph_uri: Optional[List[str]] = None,
named_graph_uri: Optional[List[str]] = None,
**kwargs,
) -> str:
"""Executes a SPARQL graph query.
Args:
Expand Down Expand Up @@ -431,9 +475,35 @@ def graph(self, query, content_type=content_types.TURTLE, **kwargs):
>>> conn.graph('construct {?s ?p ?o} where {?s ?p ?o}',
bindings={'o': '<urn:a>'})
"""
return self.__query(query, "query", content_type, **kwargs)
return self.__query(
query=query,
method="query",
content_type=content_type,
base_uri=base_uri,
limit=limit,
offset=offset,
timeout=timeout,
reasoning=reasoning,
bindings=bindings,
default_graph_uri=default_graph_uri,
named_graph_uri=named_graph_uri,
**kwargs,
)

def paths(self, query, content_type=content_types.SPARQL_JSON, **kwargs):
def paths(
self,
query: str,
base_uri: Optional[str] = None,
limit: Optional[int] = None,
offset: Optional[int] = None,
timeout: Optional[int] = None,
reasoning: Optional[bool] = None,
bindings: Optional[Dict[str, str]] = None,
content_type=content_types.SPARQL_JSON,
default_graph_uri: Optional[List[str]] = None,
named_graph_uri: Optional[List[str]] = None,
**kwargs,
) -> Union[Dict, str]:
"""Executes a SPARQL paths query.
Args:
Expand Down Expand Up @@ -461,9 +531,34 @@ def paths(self, query, content_type=content_types.SPARQL_JSON, **kwargs):
>>> conn.paths('paths start ?x = :subj end ?y = :obj via ?p',
reasoning=True)
"""
return self.__query(query, "query", content_type, **kwargs)
return self.__query(
query=query,
method="query",
content_type=content_type,
base_uri=base_uri,
limit=limit,
offset=offset,
timeout=timeout,
reasoning=reasoning,
bindings=bindings,
default_graph_uri=default_graph_uri,
named_graph_uri=named_graph_uri,
**kwargs,
)

def ask(self, query, **kwargs):
def ask(
self,
query: str,
base_uri: Optional[str] = None,
limit: Optional[int] = None,
offset: Optional[int] = None,
timeout: Optional[int] = None,
reasoning: Optional[bool] = None,
bindings: Optional[Dict[str, str]] = None,
default_graph_uri: Optional[List[str]] = None,
named_graph_uri: Optional[List[str]] = None,
**kwargs,
) -> bool:
"""Executes a SPARQL ask query.
Args:
Expand All @@ -485,10 +580,38 @@ def ask(self, query, **kwargs):
Examples:
>>> conn.ask('ask {:subj :pred :obj}', reasoning=True)
"""
r = self.__query(query, "query", content_types.BOOLEAN, **kwargs)

r = self.__query(
query=query,
method="query",
content_type=content_types.BOOLEAN,
base_uri=base_uri,
limit=limit,
offset=offset,
timeout=timeout,
reasoning=reasoning,
bindings=bindings,
default_graph_uri=default_graph_uri,
named_graph_uri=named_graph_uri,
**kwargs,
)
return strtobool(r.decode())

def update(self, query, **kwargs):
def update(
self,
query: str,
base_uri: Optional[str] = None,
limit: Optional[int] = None,
offset: Optional[int] = None,
timeout: Optional[int] = None,
reasoning: Optional[bool] = None,
bindings: Optional[Dict[str, str]] = None,
using_graph_uri: Optional[List[str]] = None,
using_named_graph_uri: Optional[List[str]] = None,
remove_graph_uri: Optional[str] = None,
insert_graph_uri: Optional[str] = None,
**kwargs,
):
"""Executes a SPARQL update query.
Args:
Expand All @@ -509,7 +632,23 @@ def update(self, query, **kwargs):
Examples:
>>> conn.update('delete where {?s ?p ?o}')
"""
self.__query(query, "update", None, **kwargs)

self.__query(
query=query,
method="update",
content_type=None,
base_uri=base_uri,
limit=limit,
offset=offset,
timeout=timeout,
reasoning=reasoning,
bindings=bindings,
using_graph_uri=using_graph_uri,
using_named_graph_uri=using_named_graph_uri,
remove_graph_uri=remove_graph_uri,
insert_graph_uri=insert_graph_uri,
**kwargs,
)

def is_consistent(self, graph_uri=None):
"""Checks if the database or named graph is consistent wrt its schema.
Expand Down

0 comments on commit e1ee5a6

Please sign in to comment.