我需要在Neo4j中创建一个二叉树。我已经开始创建两个CSV,一个用于顶点,一个用于边缘,然后我启动了两个查询来创建整个树。从CSV加载创建二叉树
我认为我可以创建只有一个查询整个树。 从我开始在CSV是这样的:
"parent","child_1","child_1_attr1","child_1_attr2","edge_1_attr1","edge_1_attr2","child_2","child_2_attr1","child_2_attr2","edge_2_attr1","edge_2_attr2"
"vertex_1","vertex_2","2","5","4","1","vertex_3","5","3","2","2"
"vertex_2","vertex_4","3","5","2","3","vertex_5","4","4","4","3"
"vertex_3","vertex_6","2","1","2","4","vertex_7","2","2","5","5"
"vertex_4","vertex_8","4","4","4","5","vertex_9","2","3","2","5"
"vertex_5","vertex_10","1","1","3","3","vertex_11","1","3","2","3"
"vertex_6","vertex_12","3","1","1","1","vertex_13","1","2","5","1"
"vertex_7","vertex_14","4","2","2","1","vertex_15","2","5","4","3"
然后我尝试此查询:
LOAD CSV WITH HEADERS FROM 'file:///Prova1.csv' AS line
Match (p:Vertex {name: line.parent})
Create (c1:Vertex {name: line.child_1, attr1: line.child_1_attr1, attr2: line.child_1_attr2})
Create (c2:Vertex {name: line.child_2, attr1: line.child_2_attr1, attr2: line.child_2_attr2})
Create (p)<-[:EDGE {attr1: line.edge_1_attr1, attr2: line.edge_1_attr2}]-(c1)
Create (p)<-[:EDGE {attr1: line.edge_2_attr1, attr2: line.edge_2_attr2}]-(c2)
此查询我手动创建的第一个顶点之前,和我运行此查询,但只结果是我得到的是Vertices 1,2和3的创建。 它应该匹配父(始终已经创建),然后创建两个孩子,然后它应该将这两个孩子连接到他的父亲。
谁能帮帮我?
首先,感谢对Cypher代码执行的详细解释,这是非常有用的,因为我正在通过我自己的Neo4j学习大学项目很难找到像这样简单的解释。 –
顺便说一句,前几天我设法创建一个单一的查询树和像这样的小的,它的工作原理。事实是,我需要管理至少有2百万个节点的树,并且我正在考虑使用这种方法来改进创建带有2个CSV(一个用于节点,一个用于边)的2M节点树,在这种情况下需要300秒(在通用笔记本电脑上使用 '使用定期COMMIT')。 你认为用你的查询'使用周期性提交'会起作用吗?而且,你认为这个查询实际上可以缩短创建时间吗? –
使用周期性COMMIT应该可以提高导入性能,并且您绝对需要一个唯一的约束:顶点(名称)(或者至少一个索引,如果名称不是唯一的顶点)。如果使用2个CSV,其中一个用于节点,另一个用于边缘,则可以在关系CSV中的顶点上自由使用MATCH而不是MERGE,并且可以在节点之间自行创建CREATE,这应该有助于提高性能。 – InverseFalcon