我如何在标准的基于 Web 的客户端中查询 Neo4j 以获取日期之间的节点?
How can I query Neo4j for nodes between dates in the standard web based client?
我在集合中有一些节点具有日期时间:
我使用 C# cypher client 查询这个:
GraphClient _client = new GraphClient(new Uri(url));
DateTime dt;
_client.Cypher
.Match("(e:LineStop)")
.Where((LineStop e) => e.AddedToDataWarehouse == false && e.TimeCreated >= dt)
.AndWhere((LineStop e) => e.Duration >0)
.Return<LineStop>("e")
.Results;
这有效。
我如何使用基于 Web 的标准 Neo4j Graph 客户端来做同样的事情?我似乎根本无法使用语法。
所有现有的问答似乎 。我不能这样做。数据已经存在。我没有设计这个系统,我也没有能力改变它。
设计这个系统的人(一个不再在公司工作的承包商)告诉我 Neo4j 现在支持日期(as opposed to stringfying them)。在某种程度上它必须,否则 C# 代码如何工作,对吗?
看来你需要一个字符串拆分函数:
match (l.LineStop)-[:Creates]->(ls.LineStop)
where l.Name = 'M-E' AND
split(ls.TimeCreated, 'T')[0] = '2017-03-17'
return l, ls limit 100
在这种情况下,STARTS WITH
谓词应该可以解决问题:
match (l.LineStop)-[:Creates]->(ls.LineStop)
where l.Name = 'M-E' AND ls.TimeCreated starts with '2017-03-17'
return l, ls limit 100
C# 代码 是 将日期视为字符串,如果您查看通过线路发送的内容(使用 Fiddler),您会看到 [=63= 】 都逃过了。重要的是,它将其视为可排序的 ISO 格式。如果您选择使用 US/UK 格式存储它们,您很快就会发现比较不起作用。
比较由 Neo4j 完成 - 显示您所处情况的示例密码在这里:
MATCH (n) RETURN
CASE WHEN ("2017-03-19T08:12:17.9680461+00:00" > "2017-03-20T08:12:17.9680461+00:00") = true
THEN "TRUE"
ELSE "FALSE"
END
如果将其放入浏览器,您将得到 FALSE
。
您的查询无效,因为您正在进行字符串比较,而'2017-03-17'
与不相同您创建的实际字符串。在下面的两个选项中——添加 属性 是最佳途径——并且不涉及更改图的结构,但显然取决于在节点上设置 属性 的能力。
如果您不能向对象添加额外的属性
做一个'Between'风格的方法-
您必须传入一个完全定义的 DateTimeOffset
字符串示例:2017-03-19T08:12:17.9680461+00:00
进行相等比较(仅指定日期)
使用 STARTS WITH
作为@InverseFalcon 所说
这很尴尬,因为完整的 DTOffset 字符串又长又笨重:/
如果你可以添加一个属性
我会添加 Ticks
版本的 DateTime
属性,即有一个名为 TimeCreatedTicks
的 属性,它只是 .Ticks
属性 的 TimeCreated
属性。这是我存储日期的一般路线。
对于手动查询,这仍然很痛苦,因为您需要知道给定日期的 Ticks
- 而这(至少对我而言)通常涉及到 LinqPad 和 运行 new DateTime(2017,3,17).Ticks.Dump()
我在集合中有一些节点具有日期时间:
我使用 C# cypher client 查询这个:
GraphClient _client = new GraphClient(new Uri(url));
DateTime dt;
_client.Cypher
.Match("(e:LineStop)")
.Where((LineStop e) => e.AddedToDataWarehouse == false && e.TimeCreated >= dt)
.AndWhere((LineStop e) => e.Duration >0)
.Return<LineStop>("e")
.Results;
这有效。
我如何使用基于 Web 的标准 Neo4j Graph 客户端来做同样的事情?我似乎根本无法使用语法。
所有现有的问答似乎
设计这个系统的人(一个不再在公司工作的承包商)告诉我 Neo4j 现在支持日期(as opposed to stringfying them)。在某种程度上它必须,否则 C# 代码如何工作,对吗?
看来你需要一个字符串拆分函数:
match (l.LineStop)-[:Creates]->(ls.LineStop)
where l.Name = 'M-E' AND
split(ls.TimeCreated, 'T')[0] = '2017-03-17'
return l, ls limit 100
在这种情况下,STARTS WITH
谓词应该可以解决问题:
match (l.LineStop)-[:Creates]->(ls.LineStop)
where l.Name = 'M-E' AND ls.TimeCreated starts with '2017-03-17'
return l, ls limit 100
C# 代码 是 将日期视为字符串,如果您查看通过线路发送的内容(使用 Fiddler),您会看到 [=63= 】 都逃过了。重要的是,它将其视为可排序的 ISO 格式。如果您选择使用 US/UK 格式存储它们,您很快就会发现比较不起作用。
比较由 Neo4j 完成 - 显示您所处情况的示例密码在这里:
MATCH (n) RETURN
CASE WHEN ("2017-03-19T08:12:17.9680461+00:00" > "2017-03-20T08:12:17.9680461+00:00") = true
THEN "TRUE"
ELSE "FALSE"
END
如果将其放入浏览器,您将得到 FALSE
。
您的查询无效,因为您正在进行字符串比较,而'2017-03-17'
与不相同您创建的实际字符串。在下面的两个选项中——添加 属性 是最佳途径——并且不涉及更改图的结构,但显然取决于在节点上设置 属性 的能力。
如果您不能向对象添加额外的属性
做一个'Between'风格的方法- 您必须传入一个完全定义的
DateTimeOffset
字符串示例:2017-03-19T08:12:17.9680461+00:00
进行相等比较(仅指定日期) 使用
STARTS WITH
作为@InverseFalcon 所说
这很尴尬,因为完整的 DTOffset 字符串又长又笨重:/
如果你可以添加一个属性
我会添加 Ticks
版本的 DateTime
属性,即有一个名为 TimeCreatedTicks
的 属性,它只是 .Ticks
属性 的 TimeCreated
属性。这是我存储日期的一般路线。
对于手动查询,这仍然很痛苦,因为您需要知道给定日期的 Ticks
- 而这(至少对我而言)通常涉及到 LinqPad 和 运行 new DateTime(2017,3,17).Ticks.Dump()