Neo4j 查询以返回在已匹配的节点集中没有特定关系的节点

Neo4j 查询以返回在已匹配的节点集中没有特定关系的节点,neo4j,cypher,Neo4j,Cypher,下面的语句创建了我尝试使用的数据: CREATE (p:P2 {id: '1', name: 'Arthur'})<-[:EXPANDS {recorded: 1, date:1}]-(:P2Data {wage: 1000}) CREATE (d2:P2Data {wage: 1100})-[:EXPANDS {recorded: 2, date:4}]->(p) CREATE (d3:P2Data {wage: 1150})-[:EXPANDS {recorded: 3, dat

下面的语句创建了我尝试使用的数据:

CREATE (p:P2 {id: '1', name: 'Arthur'})<-[:EXPANDS {recorded: 1, date:1}]-(:P2Data {wage: 1000})
CREATE (d2:P2Data {wage: 1100})-[:EXPANDS {recorded: 2, date:4}]->(p)
CREATE (d3:P2Data {wage: 1150})-[:EXPANDS {recorded: 3, date:3}]->(p)
CREATE (d3)-[:CANCELS]->(d2)
CREATE(p:P2{id:'1',name:'Arthur'})(p)
创建(d3:P2Data{wage:1150})-[:展开{记录:3,日期:3}]>(p)
创建(d3)-[:取消]->(d2)
于是,亚瑟诞生了,最初的工资是1000英镑。在第2天我们添加信息,即从第4天起,工资将1100。在第3天我们声明工资将增加到1150,这取消了第2天的入职

现在,如果我查看历史,因为它对给定时间点有效,当时间点为2时,以下历史是正确的:

  • 第1天-工资1000
  • 第4天-工资1100
当时间点为3时,以下历史记录是正确的:

  • 第1天-工资1000
  • 第3天-工资1150
用图形表示,当我基于:expansed关系匹配P2Data时,我需要那些没有被任何其他P2Data节点取消的数据,这些P2Data节点也已被匹配

这是我迄今为止的尝试:

MATCH p=(:P2 {id: '1'})<-[x1:EXPANDS]-(d1:P2Data)
WHERE x1.recorded <= 3
WITH x1.date as date, 
FILTER(n in nodes(p) 
  WHERE n:P2Data AND 
  SIZE(FILTER(n2 IN nodes(p) WHERE (n2:P2Data)-[:CANCELS]->(n))) = 0) AS result
RETURN date, result
MATCH p=(:P2{id:'1'})
MATCH(:P2{id:'1'})LAST(x).t然后x+[date]
其他x
(完)
结果显示结果为“展开”
返回result.v,result.w
我正试图想出一种更好的建模方法,但老实说,我很困惑。

MATCH(:P2{id:'1'})LAST(x).t然后x+[date]
其他x
(完)
结果显示结果为“展开”
返回result.v,result.w

我正试图想出一种更好的建模方法,但我真的很难办。

如果您通过删除
取消
关系来修改数据模型,并在
扩展
关系类型中添加可选的
取消
日期,则可以大大简化所需的查询

例如,创建测试数据:

CREATE (p:P2 {id: '1', name: 'Arthur'})<-[:EXPANDS {recorded: 1, date:1}]-(:P2Data {wage: 1000})
CREATE (d2:P2Data {wage: 1100})-[:EXPANDS {recorded: 2, date:4, canceled: 3}]->(p)
CREATE (d3:P2Data {wage: 1150})-[:EXPANDS {recorded: 3, date:3}]->(p)
CREATE(p:P2{id:'1',name:'Arthur'})(p)
创建(d3:P2Data{wage:1150})-[:展开{记录:3,日期:3}]>(p)
执行简单查询:

MATCH p=(:P2 {id: '1'})<-[x1:EXPANDS]-(d1:P2Data)
WHERE x1.recorded <= 3 AND (x1.canceled IS NULL OR x1.canceled > 3)
RETURN x1.date AS date, d1
ORDER BY date;

MATCH p=(:P2{id:'1'})如果通过删除
CANCELS
关系来修改数据模型,并将可选的
cancelled
日期添加到
EXPANDS
关系类型,则可以大大简化所需的查询

例如,创建测试数据:

CREATE (p:P2 {id: '1', name: 'Arthur'})<-[:EXPANDS {recorded: 1, date:1}]-(:P2Data {wage: 1000})
CREATE (d2:P2Data {wage: 1100})-[:EXPANDS {recorded: 2, date:4, canceled: 3}]->(p)
CREATE (d3:P2Data {wage: 1150})-[:EXPANDS {recorded: 3, date:3}]->(p)
CREATE(p:P2{id:'1',name:'Arthur'})(p)
创建(d3:P2Data{wage:1150})-[:展开{记录:3,日期:3}]>(p)
执行简单查询:

MATCH p=(:P2 {id: '1'})<-[x1:EXPANDS]-(d1:P2Data)
WHERE x1.recorded <= 3 AND (x1.canceled IS NULL OR x1.canceled > 3)
RETURN x1.date AS date, d1
ORDER BY date;

MATCH p=(:P2{id:'1'})是的,进一步思考一下,我认为这个问题空间对于图来说不是一个很好的匹配。如果您可以通过某种方式建立连接
P2Data
节点的关系,以反映有效时间内的进度,那么您可以开发一个图形化解决方案,但这会引入一些自身的约束。如果比较是按属性排序而不是按路径进行的,那么使用图并不能获得任何结果。是的,进一步思考一下,我认为这个问题空间与图不太匹配。如果您可以通过某种方式建立连接
P2Data
节点的关系,以反映有效时间内的进度,那么您可以开发一个图形化解决方案,但这会引入一些自身的约束。如果比较是按属性排序而不是按路径进行的,则使用图形不会获得任何结果。不过,每次写入数据点时,都必须返回并更新以前的数据点以反映取消情况。这与flq在上文中遇到的
取消的
关系问题相同。双时态模型有点依赖于时间之间的固有关系,这在图形中很难动态创建和变化。
扩展
关系只需要一个
取消
值,如果该值介于其
记录的
日期
值之间,这应该是罕见的,因此,并非所有以前的点都必须更新。但是,是的,您必须检查每次需要更新的内容。但是,如果工资写入与读取相比很少,那么这可能是可以接受的。有条件地编辑一些以前的数据点似乎比编辑所有以前的数据点更糟糕,从复杂性的角度来看,写入是昂贵的。但是,每次写入数据点时,都必须返回并更新以前的数据点,以反映取消。这与flq在上文中遇到的
取消的
关系问题相同。双时态模型有点依赖于时间之间的固有关系,这在图形中很难动态创建和变化。
扩展
关系只需要一个
取消
值,如果该值介于其
记录的
日期
值之间,这应该是罕见的,因此,并非所有以前的点都必须更新。但是,是的,您必须检查每次需要更新的内容。但是,如果工资写入与读取相比不太频繁,那么这可能是可以接受的。从复杂性的角度来看,有条件地编辑一些以前的数据点似乎比编辑所有以前的数据点更糟糕。写入成本高昂。