Spark for Neo4j不会将所有关系加载到数据库中

wrrgggsh  于 2023-10-18  发布在  Spark
关注(0)|答案(1)|浏览(105)

大家好,大数据探索者们。
我使用Spark将大约1100万个关系加载到图中。(是的,所有节点都在图中)
这就是我如何使用Spark来加载关系数据。

dfRelationships.repartition(2).write.format("org.neo4j.spark.DataSource")\
.option("url", "neo4j://someurl:7687") \
.option("authentication.type", "basic")\
.option("authentication.basic.username", f"{username}")\
.option("authentication.basic.password", f"{password}")\
.mode("overwrite")\
.option("relationship", "CONNECTED")\
.option("transaction.retries", 100)\
.option("batch.size",1000)\
.option("relationship.save.strategy", "keys")\
.option("relationship.source.node.keys", "parent:id")\
.option("relationship.target.node.keys", "child:id")\
.option("relationship.source.labels", "node")\
.option("relationship.target.labels", "node")\
.save()

不使用.repartition(2)会导致一些竞争条件问题。
dfRelationships已被过滤,每个条目都已被清除。

parent , child
1        2
2        3
2        4

一旦Write命令成功,我在图中只看到大约450万个关系。让我感到困惑的是,这个命令几天前一直运行得很好,我看到所有的边缘都被加载了。
即使我从neo4j浏览器运行下面的命令,neo4j也会缓存关系吗?

:auto
MATCH (n:Node)
CALL { WITH n
DETACH DELETE n
} IN TRANSACTIONS OF 50000 ROWS;

我只是不明白为什么它如此不一致。一天前还能用的正在加载所有的关系。想知道DB端是否有需要配置的内容。只是不知道是什么导致的。调试和查询日志也不显示任何内容。将感谢任何反馈。
编辑/解决方案:
“由于我有双标签顶点,我没有在所有顶点上设置”node“标签,这导致neo4j无法找到这些顶点,因为索引只设置在”node“标签上。我错过了在一些顶点上设置标签,这导致它们没有被索引。”
为什么需要双重标签?
我们的用例需要动态标签查询,而Cypher目前还不支持。这意味着Cypher只能执行以下查询,
MATCH (u:User {username:'admin'}), (r:Role {name:'ROLE_WEB_USER'}) CREATE (u)-[:HAS_ROLE]->(r)
如果你注意到用户标签和角色标签基本上是硬编码的,没有办法让它们根据数据动态变化。(当你有一个网络图,其中随机标签将与其他随机标签配对时,这是一个大问题。我们需要找到每一种可能的关系类型,然后为每一种类型编写一个自定义查询,通过将所有内容标记为“节点”,我们的关系表简单地变成一个,而不是分割我们的数据)我相信应该有一些apoc库可以做到这一点,但我还没有找到它。
假设您有一个关系表,例如

parentid , childid, parentLabel, childLabel
1           2         User        Role
2           3         Admin       Role
2           4         Actor       Played

如果你注意到上面的每个关系行,你需要单独处理它们,因为Cypher不能动态地改变标签。
MATCH (u:User {username:'admin'}), (r:Role {name:'ROLE_WEB_USER'}) CREATE (u)-[:HAS_ROLE]->(r)
MATCH (u:Admin {username:'admin'}), (r:Role {name:'ROLE_WEB_USER'}) CREATE (u)-[:HAS_ROLE]->(r)
MATCH (u:Actor {username:'admin'}), (r:Played {name:'ROLE_WEB_USER'}) CREATE (u)-[:HAS_ROLE]->(r)
如果数据是这样的

parentid , childid, parentLabel, childLabel
1           2         NODE        NODE
2           3         NODE        NODE
2           4         NODE        NODE

一切都可以像这样加载
MATCH (u:NODE {username:'admin'}), (r:NODE {name:'ROLE_WEB_USER'}) CREATE (u)-[:RELATIOSNSHIP]->(r)

mepcadol

mepcadol1#

几天前,我遇到了类似的问题。在处理大量关系时,最佳做法是在节点上创建索引。这允许Neo4j-Spark-Connector算法有效地插入关系。你可以在添加节点的时候将索引添加到选项列表中,如下所示:

.option("schema.optimization.type", "INDEX")

如果你不知道索引是如何工作的,this Wikipedia page可能很有用。

相关问题