返回

文章详情

DuckPGQ – 一个用于图形工作负载的DuckDB社区扩展

Hacker News2026年7月24日 17:00

DuckPGQ是一个用于图形工作负载的DuckDB社区扩展,支持SQL/PGQ标准。利用DuckDB的强大功能,将高性能的基于SQL的图形查询能力直接引入您的分析工作流程。安装和加载DuckPGQ CLI Python NodeJS R Java INSTALL duckpgq FROM community ; LOAD duckpgq ; import duckdb conn = duckdb . connect () conn . install_extension ( "duckpgq" , repository = "community" ) conn . load_extension ( "duckpgq" ) import { DuckDBInstance } from '@duckdb/node-api' ; const instance = await DuckDBInstance . create (); const connection = await instance . connect (); await connection . run ( "INSTALL duckpgq FROM community" ); await connection . run ( "LOAD duckpgq" ); library ( duckdb ) con <- dbConnect ( duckdb ()) dbExecute ( con , "INSTALL duckpgq FROM community" ) dbExecute ( con , "LOAD duckpgq" ) Connection conn = DriverManager . getConnection ( "jdbc:duckdb:" ); Statement st = conn . createStatement (); st . execute ( "INSTALL duckpgq FROM community" ); st . execute ( "LOAD duckpgq" ); 关键特点 SQL/PGQ标准 支持使用SQL/PGQ进行图形模式匹配,符合SQL:2023标准。 高性能 利用DuckDB进行高效的进程内图形分析。 易于安装 通过简单的设置过程与DuckDB无缝集成,无需任何依赖项。 开源 社区驱动,可扩展且免费使用。 探索DuckPGQ跨领域的可能性 社交网络 航空数据 财务数据 设置 ATTACH 'https://github.com/Dtenwolde/duckpgq-docs/raw/refs/heads/main/datasets/snb.duckdb' ; use snb ; install duckpgq from community ; load duckpgq ; CREATE or replace PROPERTY GRAPH snb VERTEX TABLES ( Person , Forum ) EDGE TABLES ( Person_knows_person SOURCE KEY ( Person1Id ) REFERENCES Person ( id ) DESTINATION KEY ( Person2Id ) REFERENCES Person ( id ) LABEL knows , Forum_hasMember_Person SOURCE KEY ( ForumId ) REFERENCES Forum ( id ) DESTINATION KEY ( PersonId ) REFERENCES Person ( id ) LABEL hasMember ); 最短路径查询 找到共同好友 最受欢迎的人 论坛中关注最多的人的计数 -- 寻找从一个人到所有其他人的最短路径 FROM GRAPH_TABLE ( snb MATCH p = ANY SHORTEST ( p1 : person WHERE p1 . id = 14 ) - [ k : knows ] ->* ( p2 : person ) COLUMNS ( p1 . id , p2 . id as other_person_id , element_id ( p ), path_length ( p )) ); -- 寻找两个用户之间的共同好友 FROM GRAPH_TABLE ( snb MATCH ( p1 : Person WHERE p1 . id = 16 ) - [ k : knows ] -> ( p2 : Person ) <- [ k2 : knows ] - ( p3 : Person WHERE p3 . id = 32 ) COLUMNS ( p2 . firstName ) ); -- 找到3个最受欢迎的人 FROM GRAPH_TABLE ( snb MATCH ( follower : Person ) - [ follows : knows ] -> ( person : Person ) COLUMNS ( person . id AS personID , person . firstname , person . lastname , follower . id AS followerID ) ) SELECT personID , firstname , lastname , COUNT ( followerID ) AS numFollowers GROUP BY ALL ORDER BY numFollowers DESC LIMIT 3 ; -- 关注最多的人所参与的论坛数 WITH mfp AS ( FROM GRAPH_TABLE ( snb MATCH ( follower : Person ) - [ follows : knows ] -> ( person : Person ) COLUMNS ( person . id AS personID , person . firstname , follower . id AS followerID ) ) SELECT personID , firstname , COUNT ( followerID ) AS numFollowers GROUP BY ALL ORDER BY numFollowers DESC LIMIT 1 ) FROM mfp , GRAPH_TABLE ( snb MATCH ( person : Person ) <- [ fhm : hasMember ] - ( f : Forum ) COLUMNS ( person . id AS personID , f . id as forumId ) ) mem SELECT mfp . personID , mfp . firstname , mfp . numFollowers , count ( mem . forumId ) forumCount WHERE mfp . personID = mem . personID GROUP BY ALL ; 设置 ATTACH 'https://github.com/Dtenwolde/duckpgq-docs/raw/refs/heads/airline-data/datasets/airline-data-small.duckdb' as airline ; use airline ; install duckpgq from community ; load duckpgq ; CREATE PROPERTY GRAPH flight_graph VERTEX TABLES ( aircrafts_data , airports_data , bookings , flights , tickets , seats ) EDGE TABLES ( route SOURCE KEY ( departure_airport ) REFERENCES airports_data ( airport_code ) DESTINATION KEY ( arrival_airport ) REFERENCES airports_data ( airport_code ), ticket_flights SOURCE KEY ( ticket_no ) REFERENCES tickets ( ticket_no ) DESTINATION KEY ( flight_id ) REFERENCES flights ( flight_id ), bookings_tickets SOURCE KEY ( book_ref ) REFERENCES bookings ( book_ref ) DESTINATION KEY ( ticket_no ) REFERENCES tickets ( ticket_no ), boarding_passes SOURCE KEY ( ticket_no ) REFERENCES tickets ( ticket_no ) DESTINATION KEY ( seat_no ) REFERENCES seats ( seat_no ) ); 从机场之间的最短路线 平均最贵的座位 FROM ( SELECT unnest ( flights ) AS flights FROM GRAPH_TABLE ( flight_graph MATCH o = ANY SHORTEST ( a : airports_data WHERE a . airport_code = 'UKX' ) - [ fr : route ] ->* ( a2 : airports_data WHERE a2 . airport_code = 'CNN' ) COLUMNS ( edges ( o ) AS flights ) ) ) JOIN route f ON f . rowid = flights ; FROM GRAPH_TABLE ( flight_graph MATCH ( b : bookings ) - [ bt : bookings_tickets ]

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡