擅长处理千亿节点万亿条边的超大数据集,同时保持毫秒级查询延时的图数据库解决方案
采用 Apache 2.0 协议开放源代码,欢迎感兴趣的伙伴一起加入
NebulaGraph 内核及周边生态工具均提供开源版本,支持用户自行编译并体验最新能力,为您带来更灵活新颖的产品体验。
NebulaGraph 拥有遍布全球的用户和开发者以及活跃的社区,欢迎参与论坛的问答和讨论,您还可以通过提 issue 和 PR 成为我们的贡献者。
轻松对接数据可视化/图算法/图分析工具以及 Spark, Flink 以 Plato 等计算框架,扩展您的图数据处理能力。
NebulaGraph 系统架构
兼容 C++、Go、Java、Python、Node 等,总有一款适合您
#include <atomic>
#include <chrono>
#include <thread>
#include <nebula/client/Config.h>
#include <nebula/client/ConnectionPool.h>
#include <common/Init.h>
int main(int argc, char* argv[]) {
nebula::init(&argc, &argv);
auto address = "127.0.0.1:9669";
if (argc == 2) {
address = argv[1];
}
std::cout << "Current address: " << address << std::endl;
nebula::ConnectionPool pool;
pool.init({address}, nebula::Config{});
auto session = pool.getSession("root", "nebula");
if (!session.valid()) {
return -1;
}
auto result = session.execute("SHOW HOSTS");
if (result.errorCode != nebula::ErrorCode::SUCCEEDED) {
std::cout << "Exit with error code: " << static_cast<int>(result.errorCode) << std::endl;
return static_cast<int>(result.errorCode);
}
std::cout << *result.data;
std::atomic_bool complete{false};
session.asyncExecute("SHOW HOSTS", [&complete](nebula::ExecutionResponse&& cbResult) {
if (cbResult.errorCode != nebula::ErrorCode::SUCCEEDED) {
std::cout << "Exit with error code: " << static_cast<int>(cbResult.errorCode)
<< std::endl;
std::exit(static_cast<int>(cbResult.errorCode));
}
std::cout << *cbResult.data;
complete.store(true);
});
while (!complete.load()) {
std::this_thread::sleep_for(std::chrono::seconds(1));
}
session.release();
return 0;
}
import (
"fmt"
nebula "github.com/vesoft-inc/nebula-go/v3"
)
const (
address = "127.0.0.1"
// The default port of NebulaGraph 2.x is 9669.
// 3699 is only for testing.
port = 3699
username = "root"
password = "nebula"
)
// Initialize logger
var log = nebula.DefaultLogger{}
func main() {
hostAddress := nebula.HostAddress{Host: address, Port: port}
hostList := []nebula.HostAddress{hostAddress}
// Create configs for connection pool using default values
testPoolConfig := nebula.GetDefaultConf()
// Initialize connection pool
pool, err := nebula.NewConnectionPool(hostList, testPoolConfig, log)
if err != nil {
log.Fatal(fmt.Sprintf("Fail to initialize the connection pool, host: %s, port: %d, %s", address, port, err.Error()))
}
// Close all connections in the pool
defer pool.Close()
// Create session
session, err := pool.GetSession(username, password)
if err != nil {
log.Fatal(fmt.Sprintf("Fail to create a new session from connection pool, username: %s, password: %s, %s",
username, password, err.Error()))
}
// Release session and return connection back to connection pool
defer session.Release()
checkResultSet := func(prefix string, res *nebula.ResultSet) {
if !res.IsSucceed() {
log.Fatal(fmt.Sprintf("%s, ErrorCode: %v, ErrorMsg: %s", prefix, res.GetErrorCode(), res.GetErrorMsg()))
}
}
{
// Prepare the query
createSchema := "CREATE SPACE IF NOT EXISTS basic_example_space(vid_type=FIXED_STRING(20)); " +
"USE basic_example_space;" +
"CREATE TAG IF NOT EXISTS person(name string, age int);" +
"CREATE EDGE IF NOT EXISTS like(likeness double)"
// Excute a query
resultSet, err := session.Execute(createSchema)
if err != nil {
fmt.Print(err.Error())
return
}
checkResultSet(createSchema, resultSet)
}
// Drop space
{
query := "DROP SPACE IF EXISTS basic_example_space"
// Send query
resultSet, err := session.Execute(query)
if err != nil {
fmt.Print(err.Error())
return
}
checkResultSet(query, resultSet)
}
fmt.Print("
")
log.Info("Nebula Go Client Basic Example Finished")
}
NebulaPoolConfig nebulaPoolConfig = new NebulaPoolConfig();
nebulaPoolConfig.setMaxConnSize(10);
List<HostAddress> addresses = Arrays.asList(new HostAddress("127.0.0.1", 9669),
new HostAddress("127.0.0.1", 9670));
NebulaPool pool = new NebulaPool();
pool.init(addresses, nebulaPoolConfig);
Session session = pool.getSession("root", "nebula", false);
session.execute("SHOW HOSTS;");
session.release();
pool.close();
from nebula3.gclient.net import ConnectionPool
from nebula3.Config import Config
# define a config
config = Config()
config.max_connection_pool_size = 10
# init connection pool
connection_pool = ConnectionPool()
# if the given servers are ok, return true, else return false
ok = connection_pool.init([('127.0.0.1', 9669)], config)
# option 1 control the connection release yourself
# get session from the pool
session = connection_pool.get_session('root', 'nebula')
# select space
session.execute('USE nba')
# show tags
result = session.execute('SHOW TAGS')
print(result)
# release session
session.release()
# option 2 with session_context, session will be released automatically
with connection_pool.session_context('root', 'nebula') as session:
session.execute('USE nba')
result = session.execute('SHOW TAGS')
print(result)
# close the pool
connection_pool.close()
// ESM
import { createClient } from '@nebula-contrib/nebula-nodejs'
// CommonJS
// const { createClient } = require('@nebula-contrib/nebula-nodejs')
// Connection Options
const options = {
servers: ['ip-1:port','ip-2:port'],
userName: 'xxx',
password: 'xxx',
space: 'space name',
poolSize: 5,
bufferSize: 2000,
executeTimeout: 15000,
pingInterval: 60000
}
// Create client
const client = createClient(options)
// Execute command
// 1. return parsed data (recommend)
const response = await client.execute('GET SUBGRAPH 3 STEPS FROM -7897618527020261406')
// 2. return nebula original data
const responseOriginal = await client.execute('GET SUBGRAPH 3 STEPS FROM -7897618527020261406', true)
无论你是架构师、工程师、数据科学家,还是业务决策者