使用Amazon Neptune和SPARQL进行高级图数据库查询

61 阅读2分钟

引言

Amazon Neptune是一种高性能的图分析和无服务器数据库,提供了卓越的可扩展性和可用性。本文旨在介绍如何使用SPARQL查询语言在Amazon Neptune图数据库中查询资源描述框架(RDF)数据,并将结果转换成人类可读的响应。本示例展示了如何使用NeptuneRdfGraph类连接Neptune数据库并加载其架构,以及如何通过NeptuneSparqlQAChain连接图和LLM以进行自然语言问答。

主要内容

1. 设置环境

首先,需要准备一个可以访问的Neptune 1.2.x集群和包含Python 3.9或更高版本的内核。确保IAM角色具有以下策略,以便访问Bedrock服务:

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

此外,还需要在同一个账户和区域内设置一个用于存储示例数据的S3桶。

2. 加载W3C组织数据

通过以下步骤,将W3C组织数据和实例上传至S3桶:

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

然后,使用Bulk-load命令将ttl文件加载至Neptune:

%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,
)

4. 提问示例

利用NeptuneSparqlQAChain对图数据进行自然语言提问:

chain.invoke("""How many organizations are in the graph""")
chain.invoke("""Are there any mergers or acquisitions""")
chain.invoke("""Find organizations""")
chain.invoke("""Find sites of MegaSystems or MegaFinancial""")
chain.invoke("""Find a member who is manager of one or more members.""")
chain.invoke("""Find five members and who their manager is.""")
chain.invoke(
    """Find org units or suborganizations of The Mega Group. What are the sites of those units?"""
)

常见问题和解决方案

Q1: 数据加载失败怎么办?

  • 检查S3桶权限和区域设置是否正确。
  • 确保Neptune集群和S3桶在同一区域。

Q2: 如何处理API调用失败?

  • 由于网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。

总结和进一步学习资源

通过本文的示例,您可以学习如何配置和使用Amazon Neptune与SPARQL进行高级图数据库查询。这为处理复杂的图数据分析提供了有力工具。

进一步学习资源:

参考资料

  • Amazon Neptune官方文档
  • SPARQL标准文档
  • LangChain文档及示例

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

---END---