我如何在标准的基于 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()