Gremlin:日期过滤器
Gremlin: Date filters
根据日期字段过滤图形数据库:我搜索了 http://tinkerpop.apache.org/docs/current/reference/ 但没有找到相同的文档。
做了一些研究,似乎 lt
、gt
等都有效。但是我下面的方法是正确的方法吗?或者有官方的方法吗?
下面的代码适用于 Neptune 和 NEO4J,但它与供应商无关。
还找到一个4/5年的old post,建议用long,不过我觉得挺老的了。
示例数据:
g.addV("TestDate2").property("title", "Alpha").property("date", "01-19-2018")
g.addV("TestDate2").property("title", "Bravo").property("date", "02-20-2018")
g.addV("TestDate2").property("title", "Charlie").property("date", "03-13-2018")
g.addV("TestDate2").property("title", "Delta").property("date", "04-14-2018")
g.addV("TestDate2").property("title", "Echo").property("date", "05-15-2018")
g.addV("TestDate2").property("title", "Foxtrot").property("date", "06-16-2018")
g.addV("TestDate2").property("title", "Hotel").property("date", "07-17-2018")
g.addV("TestDate2").property("title", "India").property("date", "08-18-2018")
查询:
(我对输出数据进行了格式化,因此它不会真正匹配 Gremlin 输出,但它更具可读性)
小于
g.V().has("TestDate2", "date", lt("03-03-2018")).valueMap()
{'date': ['02-20-2018'], 'title': ['Bravo']}
{'date': ['01-19-2018'], 'title': ['Alpha']}
g.V().has("TestDate2", "date", lt("03-24-2018")).valueMap()
{'date': ['03-13-2018'], 'title': ['Charlie']}
{'date': ['02-20-2018'], 'title': ['Bravo']}
{'date': ['01-19-2018'], 'title': ['Alpha']}
大于
g.V().has("TestDate2", "date", gt("06-16-2018")).valueMap()
{'date': ['07-17-2018'], 'title': ['Hotel']}
{'date': ['08-18-2018'], 'title': ['India']}
g.V().has("TestDate2", "date", gte("06-16-2018")).valueMap()
{'date': ['07-17-2018'], 'title': ['Hotel']}
{'date': ['06-16-2018'], 'title': ['Foxtrot']}
{'date': ['08-18-2018'], 'title': ['India']}
过滤器之间
g.V().has("TestDate2", "date", between("04-01-2018", "07-01-2018")).valueMap()
{'date': ['06-16-2018'], 'title': ['Foxtrot']}
{'date': ['04-14-2018'], 'title': ['Delta']}
{'date': ['05-15-2018'], 'title': ['Echo']}
失败,但很好
g.V().has("TestDate2", "date", lt("3-3-2018")).valueMap()
{'date': ['03-13-2018'], 'title': ['Charlie']}
{'date': ['07-17-2018'], 'title': ['Hotel']}
{'date': ['02-20-2018'], 'title': ['Bravo']}
{'date': ['06-16-2018'], 'title': ['Foxtrot']}
{'date': ['04-14-2018'], 'title': ['Delta']}
{'date': ['08-18-2018'], 'title': ['India']}
{'date': ['01-19-2018'], 'title': ['Alpha']}
{'date': ['05-15-2018'], 'title': ['Echo']}
如果您将 Gremlin 查询作为字符串从 Python(或与此相关的任何其他语言)提交,Amazon Neptune 具有用于指定日期的自定义语法。您可以使用函数 datetime()
将您的日期指定为 ISO8061 格式的字符串。此语法将 String 标识为 Date 对象并相应地对其进行处理。因此,您不必依赖字典字符串比较来比较日期。这已记录在案 here。
例如,您可以将查询写成字符串形式如下:
// Insert Date as property
String insertQuery = "g.addV('TestDate2').property('title','Alpha').property('date', datetime('2018-01-19T00:00:00'))";
// Query for the date added above
String query = "g.V().hasLabel('TestDate2').has('date',gte(datetime('1929-01-01T00:00:00'))).valueMap()";
话虽如此,正如其他人所提到的,您还可以使用 GLV 客户端(使用 Gremlin 字节码而不是 String 提交查询)并使用客户端语言的本机 Date 实现本身。
根据日期字段过滤图形数据库:我搜索了 http://tinkerpop.apache.org/docs/current/reference/ 但没有找到相同的文档。
做了一些研究,似乎 lt
、gt
等都有效。但是我下面的方法是正确的方法吗?或者有官方的方法吗?
下面的代码适用于 Neptune 和 NEO4J,但它与供应商无关。
还找到一个4/5年的old post,建议用long,不过我觉得挺老的了。
示例数据:
g.addV("TestDate2").property("title", "Alpha").property("date", "01-19-2018")
g.addV("TestDate2").property("title", "Bravo").property("date", "02-20-2018")
g.addV("TestDate2").property("title", "Charlie").property("date", "03-13-2018")
g.addV("TestDate2").property("title", "Delta").property("date", "04-14-2018")
g.addV("TestDate2").property("title", "Echo").property("date", "05-15-2018")
g.addV("TestDate2").property("title", "Foxtrot").property("date", "06-16-2018")
g.addV("TestDate2").property("title", "Hotel").property("date", "07-17-2018")
g.addV("TestDate2").property("title", "India").property("date", "08-18-2018")
查询:
(我对输出数据进行了格式化,因此它不会真正匹配 Gremlin 输出,但它更具可读性)
小于
g.V().has("TestDate2", "date", lt("03-03-2018")).valueMap()
{'date': ['02-20-2018'], 'title': ['Bravo']}
{'date': ['01-19-2018'], 'title': ['Alpha']}
g.V().has("TestDate2", "date", lt("03-24-2018")).valueMap()
{'date': ['03-13-2018'], 'title': ['Charlie']}
{'date': ['02-20-2018'], 'title': ['Bravo']}
{'date': ['01-19-2018'], 'title': ['Alpha']}
大于
g.V().has("TestDate2", "date", gt("06-16-2018")).valueMap()
{'date': ['07-17-2018'], 'title': ['Hotel']}
{'date': ['08-18-2018'], 'title': ['India']}
g.V().has("TestDate2", "date", gte("06-16-2018")).valueMap()
{'date': ['07-17-2018'], 'title': ['Hotel']}
{'date': ['06-16-2018'], 'title': ['Foxtrot']}
{'date': ['08-18-2018'], 'title': ['India']}
过滤器之间
g.V().has("TestDate2", "date", between("04-01-2018", "07-01-2018")).valueMap()
{'date': ['06-16-2018'], 'title': ['Foxtrot']}
{'date': ['04-14-2018'], 'title': ['Delta']}
{'date': ['05-15-2018'], 'title': ['Echo']}
失败,但很好
g.V().has("TestDate2", "date", lt("3-3-2018")).valueMap()
{'date': ['03-13-2018'], 'title': ['Charlie']}
{'date': ['07-17-2018'], 'title': ['Hotel']}
{'date': ['02-20-2018'], 'title': ['Bravo']}
{'date': ['06-16-2018'], 'title': ['Foxtrot']}
{'date': ['04-14-2018'], 'title': ['Delta']}
{'date': ['08-18-2018'], 'title': ['India']}
{'date': ['01-19-2018'], 'title': ['Alpha']}
{'date': ['05-15-2018'], 'title': ['Echo']}
如果您将 Gremlin 查询作为字符串从 Python(或与此相关的任何其他语言)提交,Amazon Neptune 具有用于指定日期的自定义语法。您可以使用函数 datetime()
将您的日期指定为 ISO8061 格式的字符串。此语法将 String 标识为 Date 对象并相应地对其进行处理。因此,您不必依赖字典字符串比较来比较日期。这已记录在案 here。
例如,您可以将查询写成字符串形式如下:
// Insert Date as property
String insertQuery = "g.addV('TestDate2').property('title','Alpha').property('date', datetime('2018-01-19T00:00:00'))";
// Query for the date added above
String query = "g.V().hasLabel('TestDate2').has('date',gte(datetime('1929-01-01T00:00:00'))).valueMap()";
话虽如此,正如其他人所提到的,您还可以使用 GLV 客户端(使用 Gremlin 字节码而不是 String 提交查询)并使用客户端语言的本机 Date 实现本身。