mirror of
https://github.com/hwchase17/langchain.git
synced 2025-09-09 06:53:59 +00:00
Support for SPARQL (#7165)
# [SPARQL](https://www.w3.org/TR/rdf-sparql-query/) for [LangChain](https://github.com/hwchase17/langchain) ## Description LangChain support for knowledge graphs relying on W3C standards using RDFlib: SPARQL/ RDF(S)/ OWL with special focus on RDF \ * Works with local files, files from the web, and SPARQL endpoints * Supports both SELECT and UPDATE queries * Includes both a Jupyter notebook with an example and integration tests ## Contribution compared to related PRs and discussions * [Wikibase agent](https://github.com/hwchase17/langchain/pull/2690) - uses SPARQL, but specifically for wikibase querying * [Cypher qa](https://github.com/hwchase17/langchain/pull/5078) - graph DB question answering for Neo4J via Cypher * [PR 6050](https://github.com/hwchase17/langchain/pull/6050) - tries something similar, but does not cover UPDATE queries and supports only RDF * Discussions on [w3c mailing list](mailto:semantic-web@w3.org) related to the combination of LLMs (specifically ChatGPT) and knowledge graphs ## Dependencies * [RDFlib](https://github.com/RDFLib/rdflib) ## Tag maintainer Graph database related to memory -> @hwchase17
This commit is contained in:
79
tests/integration_tests/chains/test_graph_database_sparql.py
Normal file
79
tests/integration_tests/chains/test_graph_database_sparql.py
Normal file
@@ -0,0 +1,79 @@
|
||||
"""Test RDF/ SPARQL Graph Database Chain."""
|
||||
import os
|
||||
|
||||
from langchain.chains.graph_qa.sparql import GraphSparqlQAChain
|
||||
from langchain.graphs import RdfGraph
|
||||
from langchain.llms.openai import OpenAI
|
||||
|
||||
|
||||
def test_connect_file_rdf() -> None:
|
||||
"""
|
||||
Test loading online resource.
|
||||
"""
|
||||
berners_lee_card = "http://www.w3.org/People/Berners-Lee/card"
|
||||
|
||||
graph = RdfGraph(
|
||||
source_file=berners_lee_card,
|
||||
standard="rdf",
|
||||
)
|
||||
|
||||
query = """SELECT ?s ?p ?o\n""" """WHERE { ?s ?p ?o }"""
|
||||
|
||||
output = graph.query(query)
|
||||
assert len(output) == 86
|
||||
|
||||
|
||||
def test_sparql_select() -> None:
|
||||
"""
|
||||
Test for generating and executing simple SPARQL SELECT query.
|
||||
"""
|
||||
berners_lee_card = "http://www.w3.org/People/Berners-Lee/card"
|
||||
|
||||
graph = RdfGraph(
|
||||
source_file=berners_lee_card,
|
||||
standard="rdf",
|
||||
)
|
||||
|
||||
chain = GraphSparqlQAChain.from_llm(OpenAI(temperature=0), graph=graph)
|
||||
output = chain.run("What is Tim Berners-Lee's work homepage?")
|
||||
expected_output = (
|
||||
" The work homepage of Tim Berners-Lee is "
|
||||
"http://www.w3.org/People/Berners-Lee/."
|
||||
)
|
||||
assert output == expected_output
|
||||
|
||||
|
||||
def test_sparql_insert() -> None:
|
||||
"""
|
||||
Test for generating and executing simple SPARQL INSERT query.
|
||||
"""
|
||||
berners_lee_card = "http://www.w3.org/People/Berners-Lee/card"
|
||||
_local_copy = "test.ttl"
|
||||
|
||||
graph = RdfGraph(
|
||||
source_file=berners_lee_card,
|
||||
standard="rdf",
|
||||
local_copy=_local_copy,
|
||||
)
|
||||
|
||||
chain = GraphSparqlQAChain.from_llm(OpenAI(temperature=0), graph=graph)
|
||||
chain.run(
|
||||
"Save that the person with the name 'Timothy Berners-Lee' "
|
||||
"has a work homepage at 'http://www.w3.org/foo/bar/'"
|
||||
)
|
||||
query = (
|
||||
"""PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n"""
|
||||
"""SELECT ?hp\n"""
|
||||
"""WHERE {\n"""
|
||||
""" ?person foaf:name "Timothy Berners-Lee" . \n"""
|
||||
""" ?person foaf:workplaceHomepage ?hp .\n"""
|
||||
"""}"""
|
||||
)
|
||||
output = graph.query(query)
|
||||
assert len(output) == 2
|
||||
|
||||
# clean up
|
||||
try:
|
||||
os.remove(_local_copy)
|
||||
except OSError:
|
||||
pass
|
Reference in New Issue
Block a user