GFQL概述#
刚接触GFQL,这个开源的数据帧原生图查询语言?本文概述了它所填补的空白、GPU加速等特殊功能,以及下一步的方向。
为什么选择GFQL?#
GFQL 通过提供一种在计算层操作的在处理图查询语言,解决了数据社区中的一个关键缺口。这意味着你可以:
图搜索:使用熟悉的语法轻松高效地查询和过滤节点和边。
避免外部基础设施:避免调用外部基础设施,并消除对额外数据库的需求。
利用现有工作流程:与您当前的Python数据科学工具和库集成。
实现高性能:利用GPU加速大幅提升图处理速度。
简化图分析:用Python编写表达性强且简洁的图查询。
主要特性#
数据框架原生集成: 直接与Pandas、cuDF和Apache Arrow数据框架一起工作。
高性能:针对CPU和GPU执行进行了优化,能够处理数十亿条边。
易用性:通过pip安装,无需外部数据库即可开始查询。
无缝可视化:与PyGraphistry集成,用于GPU加速的图形可视化。
灵活性: 适用于广泛的应用,包括网络安全、欺诈检测、财务分析等。
架构自由: 在本地CPU/GPU上使用GFQL与您的数据框架,或卸载到远程GPU集群。
安装指南#
GFQL 已内置在 pygraphistry 中:
pip install graphistry
确保你已经安装了pandas或cudf,这取决于你希望在CPU还是GPU上运行。
欲了解更多信息,请参阅Install。
关键GFQL概念#
GFQL 与 PyGraphistry 库的其余部分在相同的图上工作。这些操作运行在您选择的数据框架引擎之上,最初支持 Pandas 数据框架(CPU)和 cuDF 数据框架(GPU)。
节点和边:使用数据框表示,使得与Pandas和cuDF的集成无缝
功能性: 通过分层操作构建查询,类似于Pandas中的函数式方法链
查询: 使用chain()方法运行图模式匹配,风格类似于流行的OpenCypher图查询语言
谓词:应用条件根据节点和边的属性进行过滤,重用底层数据帧引擎的优化原生操作
GPU 和 CPU 向量化: GFQL 自动利用 GPU 加速和内存列式处理,以大幅提升查询速度
可选远程模式:绑定到远程数据或快速上传为Arrow格式,并在可用的远程GPU资源上运行相同的Python和GFQL查询
快速示例#
查找特定类型的节点
示例:查找所有type为“person”的节点。
from graphistry import n
people_nodes_df = g.chain([ n({"type": "person"}) ])._nodes
print('Number of person nodes:', len(people_nodes_df))
使用属性可视化2跳边序列
示例:查找边具有“interesting”: True的2跳路径。
from graphistry import n, e_forward
g_2_hops = g.chain([n(), e_forward({"interesting": True}, hops=2) ])
g_2_hops.plot()
查找1-2跳远的节点并标记每一跳
示例:查找距离节点 “a” 最多 2 跳的节点,并为每一跳打上标签。
from graphistry import n, e_undirected
g_2_hops = g.chain([
n({g._node: "a"}),
e_undirected(name="hop1"),
e_undirected(name="hop2")
])
first_hop_edges = g_2_hops._edges[ g_2_hops._edges["hop1"] == True ]
print('Number of first-hop edges:', len(first_hop_edges))
查询风险节点之间的交易节点
示例:查找两种风险节点之间的交易节点。
from graphistry import n, e_forward, e_reverse
g_risky = g.chain([
n({"risk1": True}),
e_forward(to_fixed_point=True),
n({"type": "transaction"}, name="hit"),
e_reverse(to_fixed_point=True),
n({"risk2": True})
])
hits = g_risky._nodes[ g_risky._nodes["hit"] == True ]
print('Number of transaction hits:', len(hits))
使用 `is_in` 过滤多个节点类型
示例:通过多种类型过滤节点和边。
from graphistry import n, e_forward, e_reverse, is_in
g_filtered = g.chain([
n({"type": is_in(["person", "company"])}),
e_forward({"e_type": is_in(["owns", "reviews"])}, to_fixed_point=True),
n({"type": is_in(["transaction", "account"])}, name="hit"),
e_reverse(to_fixed_point=True),
n({"risk2": True})
])
hits = g_filtered._nodes[ g_filtered._nodes["hit"] == True ]
print('Number of filtered hits:', len(hits))
利用GPU加速#
GFQL 经过优化,可以利用 cudf 和 RAPIDS 的 GPU 加速功能。当您使用 GPU 数据帧时,GFQL 会自动在 GPU 上执行查询,从而实现大幅加速。
自动GPU加速
示例:使用GPU数据帧运行GFQL查询。
import cudf
import graphistry
# Load data into GPU dataframes
e_gdf = cudf.read_parquet('edges.parquet')
n_gdf = cudf.read_parquet('nodes.parquet')
# Create a graph with GPU dataframes
g_gpu = graphistry.edges(e_gdf, 'src', 'dst').nodes(n_gdf, 'id')
# Run GFQL query (executes on GPU)
g_result = g_gpu.chain([ ... ]) # Your GFQL query here
print('Number of resulting edges:', len(g_result._edges))
强制GPU模式
示例:显式设置引擎以确保GPU执行。
g_result = g_gpu.chain([ ... ], engine='cudf')
远程运行#
您可能希望远程运行GFQL,例如,如果数据是远程的,例如在Hub或云存储中,并且您有更快的远程GPU服务器来对其进行操作。
绑定到远程数据并查询
示例:绑定到远程数据并在远程GPU资源上运行查询。
import graphistry
from graphistry import n, e
g = graphistry.bind(dataset_id='my-dataset-id')
nodes_df = g.chain_remote([ n() ])._nodes
上传数据并远程运行GPU Python
示例:将本地数据上传到远程GPU服务器并在其上运行完整的GPU Python任务。
import graphistry
from graphistry import n, e
# Fully self-contained so can be transferred
def my_remote_trim_graph_task(g):
# Trick: You can also put database fetch calls here!
return (g
.nodes(g._nodes[:10])
.edges(g._edges[:10])
)
# Upload any local graph data to the remote server
g2 = g1.upload()
print(g2._dataset_id, g2._nodes_file_id, g2._edges_file_id)
# Compute on it locally
g_result = g2.python_remote_g(my_remote_trim_graph_task)
print('Number of resulting edges:', len(g_result._edges))
另请参阅 python_remote_table() 和 python_remote_json() 以返回其他类型的数据。
可视化GFQL结果#
GFQL 与 PyGraphistry 集成,允许您使用 GPU 加速渲染来可视化您的图形。
示例:可视化高PageRank节点。
from graphistry import n, e
# Compute PageRank using cuGraph (GPU)
g_enriched = g_result.compute_cugraph('pagerank')
# Filter nodes with high PageRank
g_high_pagerank = g_enriched.chain([
n(query='pagerank > 0.1'), e(), n(query='pagerank > 0.1')
])
# Plot the subgraph
g_high_pagerank.plot()
了解更多
探索以下部分以深入了解GFQL的功能:
10分钟学会GFQL:快速入门指南,助您快速上手。
Hop & Chain 快速参考:学习如何链接多个操作以构建复杂查询。
谓词快速参考:使用谓词应用高级过滤。
GFQL API#
访问GFQL的API详细文档:
链式操作:学习如何将多个操作链接起来以构建复杂的查询。
Hop 函数:了解如何使用 hop 函数遍历图。
谓词: 使用谓词应用高级过滤。