mirror of
https://github.com/hwchase17/langchain
synced 2024-10-29 17:07:25 +00:00
db98c44f8f
# [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
80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
"""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
|