使用Amazon Neptune与SPARQL进行高效图数据查询

73 阅读2分钟

引言

在当今数据驱动的世界中,图数据库逐渐成为处理复杂数据关系的理想选择。Amazon Neptune作为一款高性能的图分析和无服务器数据库,提供了卓越的可扩展性和可用性。在这篇文章中,我们将讨论如何使用SPARQL查询语言在Amazon Neptune中进行图数据查询,并返回人类可读的响应。我们将以组织数据为例,展示如何通过NeptuneRdfGraph类连接到Neptune数据库并加载其模式,并通过NeptuneSparqlQAChain连接图和LLM进行自然语言问答。

主要内容

1. 设置环境

要在Neptune中进行查询,你需要一个可访问的Neptune 1.2.x集群,并确保Python内核版本为3.9或更高。此外,确保你的IAM角色具有以下策略,以便访问Bedrock:

{
    "Action": [
        "bedrock:ListFoundationModels",
        "bedrock:InvokeModel"
    ],
    "Resource": "*",
    "Effect": "Allow"
}

此外,你还需要一个用于暂存样本数据的S3桶,该桶应在与Neptune相同的账户和区域中。

2. 加载数据

首先,我们需要将W3C组织数据以及一些实例数据加载到我们的Neptune集群中。以下bash代码片段展示了如何进行这一操作:

STAGE_BUCKET="<bucket-name>"

%%bash  -s "$STAGE_BUCKET"

rm -rf data
mkdir -p data
cd data
echo getting org ontology and sample org instances
wget http://www.w3.org/ns/org.ttl 
wget https://raw.githubusercontent.com/aws-samples/amazon-neptune-ontology-example-blog/main/data/example_org.ttl 

echo Copying org ttl to S3
aws s3 cp org.ttl s3://$1/org.ttl
aws s3 cp example_org.ttl s3://$1/example_org.ttl

加载ttl文件:

%load -s s3://{STAGE_BUCKET} -f turtle --store-to loadres --run

%load_status {loadres['payload']['loadId']} --errors --details

3. 设置链条

安装必要的Python包:

!pip install --upgrade --quiet langchain langchain-community langchain-aws

配置NeptuneRdfGraph和NeptuneSparqlQAChain:

import boto3
from langchain.chains.graph_qa.neptune_sparql import NeptuneSparqlQAChain
from langchain_aws import ChatBedrock
from langchain_community.graphs import NeptuneRdfGraph

host = "<your host>"
port = 8182  # change if different
region = "us-east-1"  # change if different
graph = NeptuneRdfGraph(host=host, port=port, use_iam_auth=True, region_name=region)

MODEL_ID = "anthropic.claude-v2"
bedrock_client = boto3.client("bedrock-runtime")
llm = ChatBedrock(model_id=MODEL_ID, client=bedrock_client)

chain = NeptuneSparqlQAChain.from_llm(
    llm=llm,
    graph=graph,
    examples=EXAMPLES,
    verbose=True,
    top_K=10,
    return_intermediate_steps=True,
    return_direct=False,
)

代码示例

以下是一个使用SPARQL在Neptune中进行查询的完整代码示例:

EXAMPLES = """
<question>
Find organizations.
</question>

<sparql>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX org: <http://www.w3.org/ns/org#> 

select ?org ?orgName where {{
    ?org rdfs:label ?orgName .
}} 
</sparql>
"""

result = chain.invoke("""How many organizations are in the graph""")
print(result)

常见问题和解决方案

  • 网络限制问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高API访问的稳定性。
  • 缺少权限问题:请确保IAM角色具有访问Neptune和Bedrock所需的所有权限。

总结和进一步学习资源

通过本文,我们学习了如何设置Amazon Neptune环境并使用SPARQL进行高效查询。对于希望进一步学习的读者,以下资源可能会有所帮助:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---