3

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

在此处输入图像描述

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

我尝试连接的两个节点(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

上述查询产生以下子图(表明各个查询有效,对吗?)

在此处输入图像描述 在此处输入图像描述

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

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。这样做的正确方法是什么?

4

1 回答 1

4

关于与笛卡尔积相关的警告:发生这种情况是因为您正在使用MATCH两个节点,它们之间没有任何关系。看看这里这里

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

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)

结果:

结果

于 2017-08-14T11:41:48.073 回答