Apache spark 带Spark的geo4j图
我使用的是Neo4j/Cypher,我的数据约为200GB,所以我想到了可扩展的解决方案“spark” 使用spark制作neo4j图形有两种解决方案: 1) Apache Spark的密码() 2) Neo4j火花连接器 我用了第一个,帽子。 预处理的CSV得到两个“geohash”信息:一个用于拾取,另一个用于每行的放下 我想要的是制作一个geohash节点的连接图 CAPS仅允许通过映射节点生成图形: 如果要将id为0的节点连接到id为1的节点,则需要与起始id为0和结束id为1建立关系 一个非常简单的布局是:Apache spark 带Spark的geo4j图,apache-spark,neo4j,Apache Spark,Neo4j,我使用的是Neo4j/Cypher,我的数据约为200GB,所以我想到了可扩展的解决方案“spark” 使用spark制作neo4j图形有两种解决方案: 1) Apache Spark的密码() 2) Neo4j火花连接器 我用了第一个,帽子。 预处理的CSV得到两个“geohash”信息:一个用于拾取,另一个用于每行的放下 我想要的是制作一个geohash节点的连接图 CAPS仅允许通过映射节点生成图形: 如果要将id为0的节点连接到id为1的节点,则需要与起始id为0和结束id为1建立关系
Nodes: (just id, no properties)
id
0
1
2
Relationships: (just the mandatory fields)
id | start | end
0 | 0 | 1
1 | 0 | 2
基于此,我将我的CSV加载到Spark数据框中,然后将数据框拆分为:
- 拾取数据帧
- 放下数据帧和
- 行程数据帧
你说得对,CAPS就像Spark一样,是一个不变的系统。但是,使用CAPS,您可以从Cypher语句中创建新的图形: 目前,
CONSTRUCT
子句对MERGE
的支持有限。它只允许将已经绑定的节点添加到新创建的图中,而每个绑定节点只添加一次,与绑定表中出现的次数无关
考虑以下查询:
MATCH (n), (m)
CONSTRUCT
CREATE (n), (m)
RETURN GRAPH
结果图的节点数与输入图的节点数相同
要解决您的问题,可以使用两种方法:a)在创建图形之前已消除重复数据,b)使用密码查询。方法b)看起来像:
// assuming that graph is the graph created at step 11
session.catalog.store("inputGraph", graph)
session.cypher("""
CATALOG CREATE GRAPH temp {
FROM GRAPH session.inputGraph
MATCH (n)
WITH DISTINCT n.a AS a, n.b as b
CONSTRUCT
CREATE (:HashNode {a: a, b as b})
RETURN GRAPH
}
""".stripMargin)
val mergeGraph = session.cypher("""
FROM GRAPH inputGraph
MATCH (from)-[via]->(to)
FROM GRAPH temp
MATCH (n), (m)
WHERE from.a = n.a AND from.b = n.b AND to.a = m.a AND to.b = m.b
CONSTRUCT
CREATE (n)-[COPY OF via]->(m)
RETURN GRAPH
""".stripMargin).graph
注意:使用bot拾取和丢弃节点(例如a和b)的属性名称请粘贴导入脚本好吗?我使用了spark的功能导入CSV文件,不过我在问题中添加了完整的注释代码,为了更加精确,您的第一个密码查询中存在一个问题:皮卡节点中的geohash字段是_c20,但是在dropoff nodes=>中它是_c22,所以这个解决方案不起作用是的,我想我在上面的注释中已经解决了这个问题。在图形导入期间,您可以修改Dropoff_映射,使其具有与拾取相同的属性名称,因为它们表示相同的概念,我想这是有意义的。您的意思是重命名列以具有相同的名称,我将尝试此确定,它仅适用于geohash,但是节点除了geohash之外还有其他属性,需要在合并节点中复制的。例如:(n1,geohash,p1)(n2,geohash,p2)(n3,geohash,p3)=>(n,geohash,p1,p2,p3)你能用同样的方法重命名它们吗?
// assuming that graph is the graph created at step 11
session.catalog.store("inputGraph", graph)
session.cypher("""
CATALOG CREATE GRAPH temp {
FROM GRAPH session.inputGraph
MATCH (n)
WITH DISTINCT n.a AS a, n.b as b
CONSTRUCT
CREATE (:HashNode {a: a, b as b})
RETURN GRAPH
}
""".stripMargin)
val mergeGraph = session.cypher("""
FROM GRAPH inputGraph
MATCH (from)-[via]->(to)
FROM GRAPH temp
MATCH (n), (m)
WHERE from.a = n.a AND from.b = n.b AND to.a = m.a AND to.b = m.b
CONSTRUCT
CREATE (n)-[COPY OF via]->(m)
RETURN GRAPH
""".stripMargin).graph