以编程方式使用文档

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:commentrdfs: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 查询分别返回 turtleboolean 格式。

让我们将一些数据插入到 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