我怎么能在cypher上使用这个SQL(neo4j)

时间:2017-04-16 14:22:28

标签: neo4j cypher

您如何将此SQL查询转换为CYPHER查询? :

SELECT n.enginetype, n.Rocket20, n.Yearlong, n.DistanceOn,
FROM TIMETAB AS n
JOIN PLANEAIR AS p ON (n.tailnum = p.tailNum)

如果在使用该查询创建任何关系或者antyhing之前是请求,请写下并帮助那个...谢谢

1 个答案:

答案 0 :(得分:1)

这是一个很好的guide for comparing SQL with Cypher,并显示了一些SQL查询的等效Cypher。

如果我们要直接翻译,我们会使用:PLANEAIR和:TIMETAB节点标签(虽然我建议使用更好的名称),我们需要它们之间的关系。我们称之为:RELATION。

SQL中的连接往往被节点之间的关系所取代,因此我们需要在图中创建这些模式:

(:PLANEAIR)-[:RELATION]->(:TIMETAB)

通常可以通过LOAD CSV将数据导入图表的方法有多种。一般方法是MERGE你的:PLANEAIR和:TIMETAB节点具有一些id或唯一属性(可能是TailNum ?,在MERGE之后使用ON CREATE SET ...在节点创建时将其余属性添加到节点,然后合并节点之间的关系。

开发人员手册的MERGE section在这里应该会有所帮助,不过我建议您阅读完整的开发手册。

有了这个,Cypher等效查询是:

MATCH (p:PLANEAIR)-[:RELATION]->(n:TIMETAB)
RETURN n.Rocket20,p.enginetype, n.year, n.distance

现在这只是SQL查询的字面翻译。但是,您可能想重新考虑您的模型,因为我不确定在保持与其节点分离的平面的时间相关数据方面有多大价值。您可能只想在:PLANEAIR节点上拥有所有:TIMETAB属性,并完全取消:TIMETAB节点。当然,您的查询和用例应该指导如何最好地建模数据。

修改

至于创建:PLANEAIR和:TIMETAB节点之间的关系(同样,我建议为这些节点使用更好的标签,甚至可能将所有与时间相关的属性保存在:Plane节点而不是单独的节点上),提供你已经创建了这些节点,你需要做一个加入匹配,但它将有助于对以下内容有一个独特的约束:PLANEAIR(tailnum):TIMETAB(tailNum)(或索引,如果这不是'应该是一个独特的财产):

CREATE CONSTRAINT ON (p:PLANEAIR)
ASSERT p.tailNum IS UNIQUE

CREATE CONSTRAINT ON (n:TIMETAB)
ASSERT n.TailNum IS UNIQUE

现在我们已准备好创建关系

MATCH (p:PLANEAIR)
MATCH (n:TIMETAB)
WHERE p.tailNum = n.tailNum
CREATE (p)-[:RELATION]->(n)
REMOVE n.tailNum

既然创建了关系,并且:删除了TIMETAB tailNum属性,我们可以删除唯一约束:TIMETAB(tailNum),因为我们需要的是:PLANEAIR。

DROP CONSTRAINT ON (n:TIMETAB)
ASSERT n.tailNum IS UNIQUE