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

确保你已经安装了pandascudf,这取决于你希望在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的功能:

GFQL API#

访问GFQL的API详细文档: