Гремлин: фильтры даты - PullRequest
0 голосов
/ 06 июля 2018

Фильтр Graph DB на основе поля даты: я искал http://tinkerpop.apache.org/docs/current/reference/, но не нашел документацию для того же.

Сделал какое-то исследование, и кажется lt, gt и т. Д. Работают НО мой нижний подход правильный путь? или есть официальный способ сделать это? Приведенный ниже код работает на Neptune и NEO4J, но не зависит ли это от поставщика.

Также найдено 4/5 лет старый пост , где его рекомендовали использовать долго, но я думаю, что он довольно старый.


Пример данных:

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']}

1 Ответ

0 голосов
/ 07 июля 2018

Если вы отправляете запрос Gremlin в виде строки из Python (или любого другого языка в этом отношении), в Amazon Neptune есть специальный синтаксис для указания дат. Вы можете использовать функцию datetime(), чтобы указать дату в виде строки в формате ISO8061. Этот синтаксис идентифицирует String как объект Date и обрабатывает его соответствующим образом. Следовательно, вам не нужно полагаться на лексикографическое сравнение строк для сравнения дат. Это задокументировано здесь .

Например, вы можете написать свои запросы в виде строки следующим образом:

// 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 языка клиента.

...