Neo4j Spark Connector v4.0.0 下从Neo4j获取Graphx图的实现方法
Neo4j Connector for Apache Spark v4.0.0 图实例获取方式
Neo4j Connector for Apache Spark v4.0.0 的核心定位是结构化DataFrame/数据集适配器,已完全移除旧版本中org.neo4j.spark.Neo4j类提供的直出Spark Graph、GraphFrames的内置API,不存在可以直接调用拿到Graph实例的入口,实际需要基于标准数据源接口读取的数据手动完成图对象构建,具体流程如下:
1. 基于标准DataSource接口读取构建图所需的两类基础数据
所有图对象的构建依赖两类结构化数据,均可通过通用读取接口拉取:
- 读取节点DataFrame:编写Cypher查询,提取目标节点的唯一标识(一般用Neo4j内部节点ID或业务唯一键)、所有需要保留的属性,生成符合图结构要求的节点数据集,核心要求是包含唯一的id列。
参考实现:val nodeDF = spark.read.format("org.neo4j.spark.DataSource") .option("url", "bolt://localhost:7687") .option("query", "MATCH (n:Person) RETURN id(n) as id, n.name as name, n.age as age") .load() - 读取关系DataFrame:编写Cypher查询,提取关系对应的起点节点ID、终点节点ID、关系类型及需要保留的关系属性,生成符合图结构要求的关系数据集,核心要求是包含
src(起点ID)、dst(终点ID)两个强制列。
参考实现:val relationDF = spark.read.format("org.neo4j.spark.DataSource") .option("url", "bolt://localhost:7687") .option("query", "MATCH (a:Person)-[r:KNOWS]->(b:Person) RETURN id(a) as src, id(b) as dst, type(r) as rel_type, r.since as since") .load()
2. 基于拉取的两类DataFrame手动构建目标Graph实例
根据实际使用的图框架,直接将上述DataFrame传入对应API完成构建即可,这部分逻辑是旧版连接器内部的封装逻辑,v4.0.0版本将其从连接器中剥离,需要用户自行实现:
- 构建GraphFrames实例:直接引入GraphFrames依赖,将节点DataFrame、关系DataFrame作为参数传入构造方法即可生成可用的图实例,示例代码:
val graph = GraphFrames(nodeDF, relationDF) - 构建GraphX实例:先将节点、关系DataFrame转换为符合GraphX要求的RDD格式,再调用GraphX的核心API封装生成Graph对象,整个过程无需额外依赖Neo4j连接器的特殊能力。
注意事项
- v4.0.0版本已彻底移除
org.neo4j.spark.Neo4j类,所有依赖该类的旧代码在当前版本下会触发类不存在的运行错误,不要尝试引用残留的旧类实现。 - 旧版连接器的图直出能力,本质也是通过读取节点、关系两类结构化数据完成的封装,v4.0.0版本的结构化数据读取能力和旧版完全对齐,不存在数据兼容问题。
内容的提问来源于stack exchange,提问作者mcsoini
相关产品推荐
相关产品推荐

