Так что мне удалось решить мою проблему с Py2neo, но не проблему с Neomodel. Если я найду способ заставить Neomodel работать, я опубликую его и либо сделаю ссылку на этот пост, либо оставлю комментарий в этой теме.
Решение Py2neo с py2neo v4.0 и neo4j v3.o
Я пробовал различные комбинации, начиная с neo4j 2.3, вместе с различными версиями py2neo, такими как 3.1.2, а затем сделал то же самое с neo4j v3.0.
Я публикую свой сценарий, который использовал для создания узла и соединения с графом, так как я сходил с ума, пытаясь выяснить, плохо ли я настроил конфигурацию или была ли ошибка в пакете, драйвере и т. Д. [1112 ]
Скрипт Py2neo
from py2neo import Node, Relationship, Graph
graph = Graph('http://localhost:7474/db/data',user='neo4j',pass word='password1234')
tx = graph.begin()
a = Node(label='hero',name='Sabri')
tx.create(a)
tx.commit()
Устаревший драйвер py2neo v3.1.2 в тандеме с Neo4j v3.4
Как обсуждалось в этом Отчет о проблеме Github https://github.com/neo4j/neo4j-python-driver/issues/252 пользователь, который сообщил о проблеме, использовал py2neo 3.1.2 вместе с Neo4jv3.4. Подозрение было связано с устаревшим драйвером (v1.1), который поставлялся с py2neo 3.1.2. Новый дистрибутив Neo4j v3.4, похоже, поставляется с новым драйвером 1.6.
Обновление py2neo до v4.0 и использование последней версии сервера Neo4j, т.е. v3.4
При этом я столкнулся с другой ошибкой
File "/Users/sjamal/.conda/envs/py2neo.v4/lib/python3.6/site-packages/py2neo/internal/http.py", line 26, in
from neo4j.addressing import SocketAddress
ModuleNotFoundError: No module named 'neo4j.addressing'
[1118 В этом потоке stackoverflow обсуждалось ( ModuleNotFoundError: нет модуля с именем 'neo4j.addressing' и ModuleNotFoundError: нет модуля с именем 'neo4j' ), что проблема может заключаться в том, что драйвер драйвера 1.6 может потребоваться вручную установил через пипс, что я и сделал.
pip install neo4j-driver==1.6.2
Теперь я получил новую ошибку, когда TypeError был перехвачен при вызове объекта карты.
File "/Users/sjamal/.conda/envs/py2neo.v4/lib/python3.6/site-packages/py2neo/internal/http.py", line 74, in fix_parameters
raise TypeError("Parameters of type {} are not supported".format(type(value).__name__))
TypeError: параметры карты типов не поддерживаются
Я обнаружил эту проблему с github, опубликованную speters-cmri https://github.com/technige/py2neo/issues/688 [ 117], который содержал следующий коммит github ( https://github.com/technige/py2neo/compare/v4...CMRI-ProCan:v4 ) для решения проблемы путем изменения скрипта json.py в пакете py2neo
я снова запустил свой скрипт, чтобы добавить тестовый узел, и он запустился без проблем.
Если вы слишком ленивы или просто слишком расстроены, чтобы пройти длинное объяснение, вот краткое изложение
1. Make sure neo4j v3.0+ is installed. I suggest you look into docker to install neo4j using a docker image
2. pip install py2neo==v4.0
3. pip install neo4j-driver==1.6.2
4. Modify json.py file as described here https://github.com/technige/py2neo/compare/v4...CMRI-ProCan:v4
5. Run py2neo script outlined above
Как только Ваши форматы даты текстового поля известны заранее, можно использовать функции Даты Matt Kruse в JavaScript, чтобы преобразовать два в метку времени, вычесть и затем записать в получающееся текстовое поле.
Одинаково Вход Даты JQuery код для stringToDate
мог быть адаптирован к Вашим целям - ниже взятий строка в формате "YYYY-MM-DD" и преобразовывает его в объект даты. Метка времени (getTime()
) из этих объектов могла использоваться для Ваших вычислений.
stringToDate: function(string) {
var matches;
if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2})$/)) {
return new Date(matches[1], matches[2] - 1, matches[3]);
} else {
return null;
};
}
Я взял то, что @PConroy сделал и добавил к нему путем выполнения вычислений для Вас. Я также добавил regex, чтобы удостовериться, что время является частью строки для создания объекта даты.
<html>
<head>
<script type="text/javascript">
function stringToDate(string) {
var matches;
if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2}) (\d{2,2}):(\d{2,2}):(\d{2,2})$/)) {
return new Date(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[6]);
} else {
return null;
};
}
//Convert duration from milliseconds to 0000:00:00.00 format
function MillisecondsToDuration(n) {
var hms = "";
var dtm = new Date();
dtm.setTime(n);
var h = "000" + Math.floor(n / 3600000);
var m = "0" + dtm.getMinutes();
var s = "0" + dtm.getSeconds();
var cs = "0" + Math.round(dtm.getMilliseconds() / 10);
hms = h.substr(h.length-4) + ":" + m.substr(m.length-2) + ":";
hms += s.substr(s.length-2) + "." + cs.substr(cs.length-2);
return hms;
}
var beginDate = stringToDate('2008-09-19 07:14:00');
var endDate = stringToDate('2008-09-19 17:35:00');
var n = endDate.getTime() - beginDate.getTime();
alert(MillisecondsToDuration(n));
</script>
</head>
<body>
</body>
</html>
Это довольно грубо, так как я кодировал его довольно быстро, но это работает. Я проверил его. Окно предупреждений отобразит 0010:21:00.00 (HHHH:MM:SS.SS). В основном все, что необходимо сделать, получают значения от текстовых полей.
Ответы, прежде всего, предполагают манипуляции со строками. Вот решение, которое работает с чистыми объектами даты:
var start = new Date().getTime();
window.setTimeout(function(){
var diff = new Date(new Date().getTime() - start);
// this will log 0 hours, 0 minutes, 1 second
console.log(diff.getHours(), diff.getMinutes(),diff.getSeconds());
},1000);
function stringToDate(string) {
var matches;
if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2}) (\d{2,2}):(\d{2,2}):(\d{2,2})$/)) {
return new Date(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[6]);
} else {
return null;
};
}
function getTimeSpan(ticks) {
var d = new Date(ticks);
return {
hour: d.getUTCHours(),
minute: d.getMinutes(),
second: d.getSeconds()
}
}
var beginDate = stringToDate('2008-09-19 07:14:00');
var endDate = stringToDate('2008-09-19 17:35:00');
var sp = getTimeSpan(endDate - beginDate);
alert("timeuse:" + sp.hour + " hour " + sp.minute + " minute " + sp.second + " second ");
вы можете использовать getUTCHours () вместо Math.floor (n / 3600000);
Используйте Math.floor (n / 3600000) вместо getUTCHours (), иначе вы потеряете количество часов, превышающее 24.
Например, если у вас 126980000 миллисекунд, это должно преобразоваться в 0035: 16: 20.00
Если вы используете getUTCHours (), вы получите неверную строку 0011: 16: 20.00
Вместо этого используйте это (модификации обозначены KK-MOD):
function MillisecondsToDuration (n) {
var hms = "";
var dtm = new Date ();
dtm.setTime (n);
var d = Math.floor (n / 3600000/24); // KK-MOD
var h = "0" + (Math.floor (n / 3600000) - (d * 24)); // KK-MOD
var m = "0" + dtm.getMinutes ();
var s = "0" + dtm.getSeconds ();
var cs = "0" + Math.round (dtm.getMilliseconds () / 10);
hms = (d> 0? d + "T": "") + h.substr (h.length - 2) + ":" + m.substr (m.substr (m.length - 2) + ":"; // KK-MOD
hms + = s.substr (s.length - 2) + "." + cs.substr (cs.length - 2);
вернуть hms; }
Итак, 192680000 отображается как 1T11: 16: 20.00, что составляет 1 день 11 часов 16 минут 20 секунд