使用Python-Neo4j创建新关系不会产生任何结果

时间:2017-08-14 11:09:46

标签: neo4j cypher neo4j-python-driver

我正在建立一个基于时间的图形数据库,围绕以下设计原则:

enter image description here

我有一个程序,可以在数据库中创建新的时间点(相关时)。我发现使用二进制搜索的相关节点然后尝试删除现有关系(如果需要)并创建新关系。

我尝试连接的两个节点(204452和203838)存在,可以使用以下语法检索:

MATCH (y1:Year)-[:CONTAINS_MONTH]->(m1:Month)-[:CONTAINS_DAY]->(d1:Day)-[:CONTAINS_TIMEPOINT]->(t1:Time)
where (y1.year='2017' AND m1.month='02' AND d1.day='28' AND t1.time='204452')
return y1, m1, d1, t1

以上查询产生以下子图(显示各个查询有效,对吗?)

enter image description here enter image description here

但是,当我尝试使用以下查询创建连接时:

MATCH (y1:Year {year:'2017'})-[:CONTAINS_MONTH]->(m1:Month {month:'02'})-[:CONTAINS_DAY]->(d1:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t1:Time {time:'203838'}),
(y2:Year {year:'2017'})-[:CONTAINS_MONTH]->(m2:Month {month:'02'})-[:CONTAINS_DAY]->(d2:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t2:Time {time:'204452'})
CREATE (t1)-[:NEXT_TIMEPOINT]->(t2)

没有任何事情发生,Neo4j网站的前端(我用来尝试识别问题)会发出关于笛卡尔产品的警告。我承认我最近才开始使用Neo4j,因此我会提到我认为上述查询应该做什么:

第一个MATCH行定义并运行第一个子查询,返回203838子图。第二个MATCH行定义并运行第二个子查询,返回204452子图。最后,CREATE行在通过上述子查询获取的两个时间节点之间创建关系。

然而,由于没有发生任何事情,我认为我对上述查询的理解是错误的,我想知道 Q1。它实际上做了什么, Q2。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

关于与笛卡儿积相关的警告:发生这种情况是因为您MATCH两个节点之间没有任何关系。看看herehere

要解决此警告,请使用两个MATCH而不是一个。我在这里模拟你的场景。这是用于创建初始数据集的查询:

CREATE (y1:Year {year:'2017'})-[:CONTAINS_MONTH]->(m1:Month {month:'02'})-[:CONTAINS_DAY]->(d1:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t1:Time {time:'203838'})
CREATE (y2:Year {year:'2017'})-[:CONTAINS_MONTH]->(m2:Month {month:'02'})-[:CONTAINS_DAY]->(d2:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t2:Time {time:'204452'})

之后(注意两个MATCH语句):

MATCH (y1:Year {year:'2017'})-[:CONTAINS_MONTH]->(m1:Month {month:'02'})-[:CONTAINS_DAY]->(d1:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t1:Time {time:'203838'})
MATCH (y2:Year {year:'2017'})-[:CONTAINS_MONTH]->(m2:Month {month:'02'})-[:CONTAINS_DAY]->(d2:Day {day:'28'})-[:CONTAINS_TIMEPOINT]->(t2:Time {time:'204452'})
CREATE (t1)-[:NEXT_TIMEPOINT]->(t2)

结果:

Result