SAP HANA Cloud 知识图谱 是一个完全集成的知识图谱解决方案,位于 SAP HANA Cloud database.
设置与安装
您必须拥有一个启用了 **三元组存储** 功能的 SAP HANA Cloud 实例。 有关详细说明,请参阅: 启用三元组存储
要将 SAP HANA 知识图谱引擎与 LangChain 配合使用,请安装 langchain-hana package:
pip install langchain_hana
首先,创建到 SAP HANA Cloud 实例的连接。
from dotenv import load_dotenv
from hdbcli import dbapi
# Load environment variables if needed
load_dotenv()
# Establish connection to SAP HANA Cloud
connection = dbapi.connect(
address=os.environ.get("HANA_DB_ADDRESS"),
port=os.environ.get("HANA_DB_PORT"),
user=os.environ.get("HANA_DB_USER"),
password=os.environ.get("HANA_DB_PASSWORD")
)
然后,导入 HanaRdfGraph 类
from langchain_hana import HanaRdfGraph
创建 HanaRdfGraph 实例
构造函数需要:
* **connection**:一个活动的 hdbcli.dbapi.connect(...) 实例 * **graph_uri**:命名图(或 "DEFAULT"),RDF 数据所在的位置 * **之一**: 1. **ontology_query**:用于提取模式三元组的 SPARQL CONSTRUCT 2. **ontology_uri**:托管本体图 URI 3. **ontology_local_file** + **ontology_local_file_format**: a local Turtle/RDF file 4. **auto_extract_ontology=True** (不推荐用于生产环境——请参见注释)
graph_uri 与本体
* **graph_uri**: SAP HANA Cloud 实例中包含实例数据的命名图(有时超过 10 万个三元组)。 If None, "" or "DEFAULT" 提供后,将使用默认图。 * **本体**:一个精简的模式(通常约 50-100 个三元组),描述类、属性、域、范围、标签、注释和子类关系。本体指导 SPARQL 生成和结果解释。
使用 **DEFAULT** 图
创建图实例的更多信息,请访问 默认图和命名图.
graph = HanaRdfGraph(
connection=connection,
auto_extract_ontology=True,
)
# graph = HanaRdfGraph(
# connection=connection,
# graph_uri="DEFAULT",
# auto_extract_ontology=True,
# )
# graph = HanaRdfGraph(
# connection=connection,
# graph_uri="",
# auto_extract_ontology=True,
# )
使用 graph_uri
graph = HanaRdfGraph(
connection=connection,
graph_uri="http://example.org/movies",
auto_extract_ontology=True,
)
使用远程 ontology_uri
直接从托管图 URI 加载模式。
graph = HanaRdfGraph(
connection=connection,
ontology_uri="<your_ontology_graph_uri>",
)
使用自定义 ontology_query
使用自定义 CONSTRUCT 查询有选择性地提取模式三元组。
ontology_query = """
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
CONSTRUCT {?cls rdf:type owl:Class . ?cls rdfs:label ?clsLabel . ?rel rdf:type ?propertyType . ?rel rdfs:label ?relLabel . ?rel rdfs:domain ?domain . ?rel rdfs:range ?range .}
FROM <kgdocu_movies>
WHERE { # get properties
{SELECT DISTINCT ?domain ?rel ?relLabel ?propertyType ?range
WHERE {
?subj ?rel ?obj .
?subj a ?domain .
OPTIONAL{?obj a ?rangeClass .}
FILTER(?rel != rdf:type)
BIND(IF(isIRI(?obj) = true, owl:ObjectProperty, owl:DatatypeProperty) AS ?propertyType)
BIND(COALESCE(?rangeClass, DATATYPE(?obj)) AS ?range)
BIND(STR(?rel) AS ?uriStr) # Convert URI to string
BIND(REPLACE(?uriStr, "^.*[/#]", "") AS ?relLabel)
}}
UNION { # get classes
SELECT DISTINCT ?cls ?clsLabel
WHERE {
?instance a/rdfs:subClassOf* ?cls .
FILTER (isIRI(?cls)) .
BIND(STR(?cls) AS ?uriStr) # Convert URI to string
BIND(REPLACE(?uriStr, "^.*[/#]", "") AS ?clsLabel)
}
}
}
"""
# can provide the graph_uri param as well if needed
graph = HanaRdfGraph(
connection=connection,
ontology_query=ontology_query,
)
使用本地 RDF 文件创建图实例
(ontology_local_file + ontology_local_file_format):从本地 RDF 本体文件加载模式。
支持的 RDF 格式包括 Turtle, RDF/XML, JSON-LD, N-Triples, Notation-3, Trig, Trix, N-Quads.
graph = HanaRdfGraph(
connection=connection,
ontology_local_file="<your_ontology_file_path>", # e.g., "ontology.ttl"
ontology_local_file_format="<your_ontology_file_format>", # e.g., "Turtle", "RDF/XML", "JSON-LD", "N-Triples", "Notation-3", "Trig", "Trix", "N-Quads"
)
本体自动提取
(auto_extract_ontology=True):直接从实例数据推断模式信息。
graph = HanaRdfGraph(
connection=connection,
graph_uri="<your_graph_uri>",
auto_extract_ontology=True,
)
> **注意**:自动提取 **不** 推荐用于生产环境——它会省略重要的三元组,如 rdfs:label, rdfs:comment和 rdfs:subClassOf 通常。
执行 SPARQL 查询
您可以使用 query() 方法执行任意 SPARQL 查询(SELECT, ASK, CONSTRUCT等)在数据图上。
该函数具有以下参数
- * **query**:SPARQL 查询字符串。
- * **content_type**:输出的响应格式(默认为 CSV)
请使用以下字符串表示相应的格式。
- * CSV:
"sparql-results+xml" - * JSON:
"sparql-results+json" - * XML:
"sparql-results+csv" - * TSV:
"sparql-results+tsv"
> **注意**:CONSTRUCT 和 ASK 查询分别返回 turtle 和 boolean 格式。
让我们将一些数据插入到 Puppets graph.
cursor = connection.cursor()
try:
result = cursor.callproc(
"SYS.SPARQL_EXECUTE", (
"""
INSERT DATA {
GRAPH {
a ; <name> "Ernie"; <show> "Sesame Street".
a ; <name> "Bert"; <show> "Sesame Street" .
}
}
""", "", "?", "?"
)
)
response = result[2]
except dbapi.Error as db_error:
raise RuntimeError(
f'The database query failed: '
f'{db_error.errortext.split("; Server Connection")[0]}'
)
finally:
cursor.close()
然后,我们为该 Puppets graph.
puppets_graph = HanaRdfGraph(
connection=connection,
graph_uri="Puppets",
auto_extract_ontology=True,
)
给定的查询列出了 Puppets graph.
query = """
SELECT ?s ?p ?o
WHERE {
GRAPH {
?s ?p ?o .
}
}
ORDER BY ?s
"""
result = puppets_graph.query(query)
print(result)
s,p,o
P1,name,Ernie
P1,show,Sesame Street
P1,http://www.w3.org/1999/02/22-rdf-syntax-ns#type,Puppet
P2,name,Bert
P2,show,Sesame Street
P2,http://www.w3.org/1999/02/22-rdf-syntax-ns#type,Puppet