使用pyTigerGraph连接Docker中TigerGraph时出现401错误
问题背景
在Ubuntu机器的Docker容器中运行TigerGraph v4.1.2(也尝试过v4.2.0社区版),按照教程使用pyTigerGraph连接实例时,执行result = self.driver.gsql('ls')或self.secret = self.driver.createSecret(SECRETALIAS)步骤时触发401认证错误:
401 Client Error: for url: http://127.0.0.1:14240/gsql/v1/statements
最初误以为是未定义目标图GRAPHNAME,最终确认是凭证输入错误,现已解决该问题。需求是完成从连接TigerGraph、创建新图、获取密钥和令牌、加载数据到分析的完整流程。
完整操作流程
1. 确认Docker内TigerGraph服务状态
进入TigerGraph容器,执行以下命令检查核心服务是否正常运行:
gadmin status
确保gpe、gse、restpp等服务处于Running状态。
2. 安装匹配版本的pyTigerGraph
根据TigerGraph 4.x版本要求,安装对应版本的pyTigerGraph:
pip install pyTigerGraph>=0.10.0
3. 初始化TigerGraph连接
使用正确的凭证建立连接,核心参数说明:
host: 本地运行填127.0.0.1,远程容器填对应主机IPusername: 社区版默认用户名是tigergraphpassword: 容器启动时设置的密码,可在容器内通过gadmin config get System.User.DefaultPassword查看graphname: 先设为"global",创建新图后再切换
示例代码:
import pyTigerGraph as tg # 配置参数 HOST = "127.0.0.1" USERNAME = "tigergraph" PASSWORD = "你的TigerGraph密码" GRAPHNAME = "MySocialGraph" SECRETALIAS = "my_app_secret" # 初始化连接 driver = tg.TigerGraphConnection( host=HOST, username=USERNAME, password=PASSWORD, graphname=GRAPHNAME, useCert=False # 社区版默认无需证书 ) # 验证连接有效性 print("连接状态:", driver.isConnected())
4. 创建新图结构
通过GSQL语句定义图的顶点和边类型,示例创建社交网络图:
# 定义建图GSQL语句 create_graph_gsql = f""" CREATE GRAPH {GRAPHNAME} ( VERTEX Person(PRIMARY_ID id INT, name STRING, age INT), VERTEX Post(PRIMARY_ID post_id INT, content STRING), EDGE Follow(FROM Person, TO Person), EDGE PostBy(FROM Post, TO Person) ) """ # 执行建图语句 driver.gsql(create_graph_gsql) # 切换到新创建的图 driver.graphname = GRAPHNAME
5. 获取Secret与认证令牌
创建Secret
# 创建指定别名的Secret secret = driver.createSecret(SECRETALIAS) print("生成的Secret:", secret)
获取认证令牌
# 获取有效期1小时的令牌 token = driver.getToken(SECRETALIAS, secret) print("认证令牌:", token) # 让driver自动使用该令牌 driver.setToken(token)
6. 加载数据
支持两种加载方式,按需选择:
单条数据插入(API方式)
# 插入Person顶点 driver.upsertVertex("Person", 1, attributes={"name": "Alice", "age": 28}) driver.upsertVertex("Person", 2, attributes={"name": "Bob", "age": 32}) # 插入Post顶点 driver.upsertVertex("Post", 101, attributes={"content": "Hello TigerGraph!"}) # 插入Follow边 driver.upsertEdge("Person", 1, "Follow", "Person", 2) # 插入PostBy边 driver.upsertEdge("Post", 101, "PostBy", "Person", 1)
CSV批量加载(GSQL方式)
将CSV文件放到容器可访问路径后,执行加载语句:
# 定义批量加载GSQL语句 load_data_gsql = f""" USE GRAPH {GRAPHNAME} BEGIN LOAD CSV WITH HEADER FROM "file:///tmp/persons.csv" TO VERTEX Person VALUES ($id, $name, $age); LOAD CSV WITH HEADER FROM "file:///tmp/posts.csv" TO VERTEX Post VALUES ($post_id, $content); LOAD CSV WITH HEADER FROM "file:///tmp/follows.csv" TO EDGE Follow VALUES ($from_id, $to_id); END """ # 执行加载 driver.gsql(load_data_gsql)
7. 数据查询与分析
基础顶点查询
# 查询所有Person顶点 all_persons = driver.getVertices("Person") print("所有Person顶点:", all_persons) # 查询指定ID的Person顶点 alice_info = driver.getVertex("Person", 1) print("Alice的信息:", alice_info)
自定义GSQL查询
创建并运行自定义查询,示例查询指定用户的关注者:
# 创建查询语句 create_query_gsql = f""" USE GRAPH {GRAPHNAME} CREATE QUERY get_user_followers(INT person_id) FOR GRAPH {GRAPHNAME} {{ SetAccum<INT> @followers; Person = {{person_id}}; Person = SELECT t FROM Person:s -(Follow)-> Person:t ACCUM s.@followers += t.id; PRINT Person.@followers; }} """ # 安装查询 driver.gsql(create_query_gsql) driver.gsql(f"INSTALL QUERY get_user_followers ON GRAPH {GRAPHNAME}") # 运行查询 followers_result = driver.runInstalledQuery("get_user_followers", params={"person_id": 1}) print("Alice的关注者ID:", followers_result)
内容的提问来源于stack exchange,提问作者Ameya Patil
相关产品推荐
相关产品推荐

