JanusGraph 实战:基于 Cassandra CQL 存储后端与 Elasticsearch 索引后端的示例应用
图数据库分布式数据库后端【免费下载链接】janusgraphJanusGraph: an open-source, distributed graph database项目地址https://gitcode.com/gh_mirrors/ja/janusgraph点击查看免费下载导读本文以 example-cql 示例为线索完整讲解如何在 JanusGraph 中组合使用CassandraCQL 存储后端与Elasticsearch混合索引后端从jgex-cql.properties配置文件逐项解析、Maven 依赖声明到通过mvn exec:java运行图应用、用-Dcmddrop清理图数据最后深入到GraphApp/JanusGraphApp源码揭示打开图 → 建 Schema → 写数据 → 查询 → 更新 → 删除 → 关闭的完整应用生命周期。读完本文你将能够独立搭建一套 JanusGraph Cassandra Elasticsearch 的本地开发环境并理解混合索引在该组合下的实际工作方式。技术选型背景为什么是 Cassandra CQL 与 ElasticsearchJanusGraph 将图数据存储与索引查询解耦为两层存储后端storage backend负责持久化顶点、边与属性索引后端index backend负责全文检索、数值范围与地理空间查询。本示例选择的两者是生态中非常经典的组合Apache Cassandra是一个面向可扩展性与高可用设计的分布式数据库。Cassandra 提供两种通信协议Thrift遗留 RPC 协议与CQL原生协议。JanusGraph 的cql存储后端即通过 CQL 协议与 Cassandra 通信这也是当前主流且持续演进的方式。Elasticsearch是一个可扩展的分布式搜索引擎充当 JanusGraph 的混合索引后端mixed index backend。在动手之前建议先查阅仓库内的版本兼容性矩阵。以当前仓库的 1.2.z 主线为例兼容范围覆盖 Cassandra 3.11.z / 4.0.z / 5.0.z以及 Elasticsearch 6.1-6.8.z / 7.y / 8.y / 9.y 与 OpenSearch 2.y / 3.y。务必保证你安装的 Cassandra 与 Elasticsearch 版本落在所选 JanusGraph 版本的支持范围内这是本示例能够顺利运行的前提。JanusGraph 配置文件逐项解析本示例的全部连接配置都集中在jgex-cql.properties中完整内容如下gremlin.graphorg.janusgraph.core.JanusGraphFactory storage.backendcql storage.cql.keyspacejgex storage.hostname127.0.0.1 index.jgex.backendelasticsearch index.jgex.index-namejgex index.jgex.hostname127.0.0.1各配置项的作用配置项含义本示例取值gremlin.graph告诉 TinkerPop 的GraphFactory使用哪个工厂类来创建图实例固定为org.janusgraph.core.JanusGraphFactoryorg.janusgraph.core.JanusGraphFactorystorage.backend存储后端类型取cql即启用 Cassandra CQL 存储后端cqlstorage.cql.keyspaceJanusGraph 在 Cassandra 中使用的 keyspace 名称jgexstorage.hostnameCassandra 服务地址127.0.0.1index.jgex.backend索引后端类型elasticsearch表示启用 Elasticsearch 混合索引elasticsearchindex.jgex.index-nameJanusGraph 在 Elasticsearch 中使用的索引名jgexindex.jgex.hostnameElasticsearch 服务地址127.0.0.1这里有一个值得注意的设计配置前缀index.jgex.*中的jgex是索引后端在 JanusGraph 内部的逻辑名称它通过index.jgex.index-namejgex与 Elasticsearch 中的物理索引名解耦。更多可用配置项请参考仓库内的配置参考文档。多图共存keyspace 与 index-name 的隔离作用这是本示例 README 强调的一个实用技巧通过为不同的图提供不同的storage.cql.keyspace与index.jgex.index-name可以在同一组 Cassandra / Elasticsearch 服务器上共存多张独立的图。例如# 图 A storage.cql.keyspacegraph_a index.jgex.index-namegraph_a # 图 B另一份 properties 文件 storage.cql.keyspacegraph_b index.jgex.index-namegraph_b图数据落在 Cassandra 的不同 keyspace 中索引数据落在 Elasticsearch 的不同 index 中二者互不干扰。从源码层面也可以印证这一点CQLConfigOptions.KEYSPACE声明 keyspace 的默认值为janusgraph并注明如果不存在会自动创建而 Elasticsearch 后端在写入时会把配置的index-name与每个 store 名称拼接成实际的索引名见ElasticSearchIndex.java中INDEX_NAME_SEPARATOR的处理逻辑。Cassandra 与 Elasticsearch 的本地默认假设jgex-cql.properties假定Cassandra 已安装在本机localhost并使用默认配置Elasticsearch 同理。也就是说Cassandra 通过 CQL 协议在默认端口9042监听127.0.0.1Elasticsearch 通过其原生协议在默认端口监听127.0.0.1。如果你把 Cassandra 或 Elasticsearch 部署在远程主机、非默认端口或集群环境中直接修改上述storage.hostname/index.jgex.hostname等项即可无需改动代码。仓库还提供了一份更完整的服务端组合配置样例 janusgraph-cql-es.properties其中包含storage.cql.local-datacenter、缓存参数cache.db-cache、cache.db-cache-size等与 Elasticsearch 相关的更多选项可作为生产化调优的参考。偷懒方案使用 JanusGraph 预打包发行版如果你不想分别安装 Cassandra 与 ElasticsearchJanusGraph 官方提供了预打包发行版pre-packaged distribution解压后即可一键启动本地 Cassandra、Elasticsearch 与 Gremlin Server开箱即用地运行本示例。该方式的具体使用说明见 docs/basics/server.md 中Using the Pre-Packaged Distribution一节。引入 Maven 依赖本示例的example-cql/pom.xml采用pom打包方式核心依赖均为runtime作用域。独立项目接入时需要声明以下依赖。CQL 存储后端依赖dependency groupIdorg.janusgraph/groupId artifactIdjanusgraph-cql/artifactId version${janusgraph.version}/version scoperuntime/scope /dependencyElasticsearch 索引后端依赖dependency groupIdorg.janusgraph/groupId artifactIdjanusgraph-es/artifactId version${janusgraph.version}/version scoperuntime/scope /dependency此外示例代码本体位于example-common模块org.janusgraph:example-common它同样以runtime作用域被引入。将三者组合后GraphFactory.open(conf)才能在运行时加载到 CQL 存储后端、Elasticsearch 索引后端与示例应用类。运行示例完整应用生命周期启动命令在janusgraph-examples聚合目录或仓库根目录下执行mvn exec:java -pl :example-cql命令中的-pl :example-cql是 Maven reactor 的模块选择语法指向 janusgraph-examples 聚合工程下的example-cql模块因此它必须从聚合目录或仓库根目录运行这正是 README 中所说可以在examples或项目目录下运行的原因。该命令由janusgraph-examples/pom.xml中配置的exec-maven-plugin驱动主类固定为org.janusgraph.example.JanusGraphApp由example.main.class属性注入启动参数中的${example.config}指向jgex-cql.properties第二个参数${cmd}默认为空。应用到底做了什么从源码看完整流程示例程序的主体是GraphApp抽象类其runApp()方法定义了完整的应用生命周期打开并初始化图openGraph()调用ConfigurationUtil.loadPropertiesConfig加载 properties再通过 TinkerPop 的GraphFactory.open(conf)创建 JanusGraph 实例定义 SchemacreateSchema()在写数据前先建立图模式构建图结构createElements()写入顶点、边与属性即经典的诸神之图 Graph of the Gods 数据查询验证readElements()执行若干 Gremlin 遍历查询循环更新与再查询随机休眠 500-1000ms 后执行updateElements()/readElements()共 3 轮删除元素deleteElements()删除指定顶点连带其入射边关闭图closeGraph()依次关闭GraphTraversalSource与Graph。该类的 Javadoc 注释将上述步骤总结为Open and initialize the graph → Define the schema → Build the graph → Run traversal queries → Make updates → Close the graph。子类JanusGraphApp则使用 JanusGraph 特有 API 定义 Schema属性键PropertyKeynameString、ageInteger、timeInteger、reasonString、placeGeoshape顶点标签titan、location、god、demigod、human、monster边标签father/motherMultiplicity.MANY2ONE、lives以reason为 signature、pet、brother、battled组合索引nameIndex精确匹配查询使用混合索引vAge顶点age数值范围查询、eReasonPlace边reasonplace全文/地理空间查询。其中混合索引只有在配置文件中存在index.jgex.backend时才启用JanusGraphApp.openGraph()中通过conf.containsKey(index. mixedIndexConfigName .backend)判断这正体现了存储后端 索引后端双层架构中 Elasticsearch 承担的角色。由于混合索引存在延迟刷新createElements()在写数据后会Thread.sleep(10000)等待索引可见。查询示例混合索引如何被使用readElements()中的三类查询分别演示了不同索引的用途// 组合索引按 name 精确查找Composite Index g.V().has(name, jupiter).valueMap(true) // 混合索引数值范围查询 age 5000Mixed Index / ES g.V().has(age, P.gte(5000)).values(age)日志输出example-cql自带的 logback.xml 将根日志级别设为INFO并单独把com.datastax.driver.core降至WARN避免 CQL 驱动刷屏。运行后你将在控制台看到opening graph、creating schema、creating elements、reading elements、updating elements、deleting elements、closing graph等关键步骤的日志。清理图数据drop 命令运行示例后图数据与索引会持久化在 Cassandra 与 Elasticsearch 中。若希望彻底清除请先停止应用程序再执行mvn exec:java -pl :example-cql -Dcmddrop-Dcmddrop通过 exec 插件注入到JanusGraphApp.main的第二个参数。从JanusGraphApp.main的源码可以看到当drop参数存在时应用只执行openGraph()与dropGraph()而dropGraph()最终调用JanusGraphFactory.drop(getJanusGraph())彻底删除存储中的图。相比之下example-common的 in-memory 后端图数据随进程结束自然消失无需 drop 操作。小结通过example-cql示例你可以掌握 JanusGraph 最主流的部署组合——Cassandra CQL 存储后端 Elasticsearch 索引后端配置层面理解storage.cql.keyspace与index.name.index-name的多图隔离机制依赖层面知道janusgraph-cql与janusgraph-es两个 runtime 依赖的分工运行层面熟悉mvn exec:java -pl :example-cql与-Dcmddrop两条命令源码层面则看清了图应用的完整生命周期与组合/混合索引的创建及查询路径。这套流程可以直接迁移到你自己的 JanusGraph 项目中只需替换配置文件中的 keyspace、索引名与主机地址即可。赞分享图数据库分布式数据库后端【免费下载链接】janusgraphJanusGraph: an open-source, distributed graph database项目地址https://gitcode.com/gh_mirrors/ja/janusgraph点击查看免费下载相关推荐JanusGraph 示例配置实战BerkeleyDB、Cassandra 与 HBase 存储后端及 Elasticsearch 索引后端组合配置详解JanusGraph 示例配置实战BerkeleyDB、Cassandra 与 HBase 存储后端及 Elasticsearch 索引后端组合配置详解 本文图数据库分布式数据库后端JanusGraph 从 Thrift 后端迁移到 CQL 后端配置替换与实战指南JanusGraph 从 Thrift 后端迁移到 CQL 后端配置替换与实战指南 导读 本指南聚焦于 JanusGraph 存储后端的重大切换把由旧版 C图数据库分布式数据库后端JanusGraph 与 Apache Cassandra 集成部署全指南CQL 存储后端、四种部署模式与云托管实践JanusGraph 与 Apache Cassandra 集成部署全指南CQL 存储后端、四种部署模式与云托管实践 本指南以 JanusGraph 官方文档图数据库分布式数据库后端上一篇如何让macOS原生支持200视频格式预览QuickLookVideo终极指南下一篇Komodo代码覆盖率报告确保核心功能全面测试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Kun 学术答辩「青绿」风格设计系统:从视觉基线到治理执行的一站式技术指南

Kun 学术答辩「青绿」风格设计系统:从视觉基线到治理执行的一站式技术指南

人工智能AI Agent自主智能体桌面应用MCP Clients 【免费下载链接】Kun Local-first AI agent workspace for coding, writing, design, research, and automation — one runtime for desktop GUI and TUI. 项目地址: https://gitcode.com/gh_mirrors/de/Kun 点击查…

2026/10/12 1:40:54 阅读更多 →
不买开发板也能学STM32:纯软件仿真外设入门指南

不买开发板也能学STM32:纯软件仿真外设入门指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:40:54 阅读更多 →
ESP8285+MQTTX:电机控制器物联网接入实战

ESP8285+MQTTX:电机控制器物联网接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 1:40:54 阅读更多 →

最新新闻

【深度学习新浪潮】Meta Muse 智能体:它是什么?有哪些特点?为什么突然火了?

【深度学习新浪潮】Meta Muse 智能体:它是什么?有哪些特点?为什么突然火了?

1. 引言 近期,Meta Muse 智能体在 AI 领域引发广泛关注,开发者、创作者与科技从业者纷纷展开讨论。许多初次接触者不禁疑惑:这是 Meta 推出的又一款大模型?抑或仅是蹭热度的 AI 玩具? 事实并非如此。Meta Muse 是 Meta 在 AI 智能体方向的一次战略性布局,它并非简单的对…

2026/10/12 2:24:22 阅读更多 →
Spring-boot-3 -注解 yaml配置 -日志

Spring-boot-3 -注解 yaml配置 -日志

4、核心技能1. 常用注解SpringBoot 摒弃 XML 配置方式,改为全注解驱动1. 组件注册Configuration 自定义配置类、SpringBootConfiguration 用来标注SpringBoot主启动类的Bean 可以在自定义配置类面创建对象交给ioc容器,组件在容器中的名字为方法名、Scope…

2026/10/12 2:24:22 阅读更多 →
Neuroimage: 动态功能连接方法的重测信度比较

Neuroimage: 动态功能连接方法的重测信度比较

本篇文献发表在Neuroimage杂志。所发布内容旨在与大家分享学术新知,促进交流学习版权归原作者或原出处所有,感谢各位学者的辛勤付出与研究成果。1.引言大脑的功能组织具有丰富的时空结构,可以使用功能连接指标进行探测。功能连接被定义为两个…

2026/10/12 2:24:22 阅读更多 →
page_alloc __rmqueue

page_alloc __rmqueue

__rmqueue() 是伙伴系统分配路径的核心调度器。它在持有 zone->lock 的前提下,按照碎片化风险从低到高的顺序,依次尝试不同的分配策略,直到成功或彻底失败。核心作用与策略链它的本质是一个多级降级策略链:先尝试最“干净”的方…

2026/10/12 2:24:22 阅读更多 →
游戏引擎中物理步进与动画采样的同步机制解析

游戏引擎中物理步进与动画采样的同步机制解析

1. 这不是教科书,是我在三个项目里拆过七次引擎后写下的物理与动画系统手记“游戏引擎架构深度解析(三):物理与动画系统”——看到这个标题,你大概率正卡在某个角色落地时穿模、布料抖动像癫痫发作、或者刚加完一个新关…

2026/10/12 2:24:22 阅读更多 →
产业与汇率全景分析深入分析多表格形成一篇文章

产业与汇率全景分析深入分析多表格形成一篇文章

产业与汇率全景深度分析:汇率是外生变量,产业是底层根基引言汇率从来不是孤立的数字,它是一国产业竞争力、贸易结构、资本流动、宏观政策、全球供需格局共同定价的结果;反过来,汇率波动又会重塑产业成本、订单、利润、…

2026/10/12 2:23:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →