
Al
24.04.2018
17:23:16

Roman
24.04.2018
17:23:57
Я же описал как.
ну ты описал если, т.е. conditional, я не понимаю как этот кондижнл задеклерить)
мне нужно чтоб cypher вернул ошибку если один из узлов не существует

Al
24.04.2018
17:26:42

Google

Al
24.04.2018
17:27:20
Ну так тупо сделай создать релейшен между 2 нодами если одной нет то будет тебе ошибкп

Roman
24.04.2018
17:28:49

Al
24.04.2018
17:29:19

Roman
24.04.2018
17:29:31
понял, сейчас попробую, в нео второй день))
можно по сути вернуть какоe поле одного из созданых элементов, если оно null тогда мол "ошибка"
но было бы неплохо сделать нечто похожее на ASSUME
MATCH (f:First),(s:Second)
WHERE f.id = "1" AND s.id = "2"
CREATE (f)-[:CONNECTED]->(s)
RETURN
CASE
WHEN f = null THEN "First not found"
WHEN s = null THEN "Second not found"
END AS error
тоже не работает ? возвращает (no changes, no records)
что-ж я делаю не так?

Al
24.04.2018
18:20:42
что-ж я делаю не так?
Ты излагаешь оконечную задачу. А не описываешь нафига это все нужно.
Ну из серии "взял шуруп и пытаюсь забивать его молотком, и шляпкой вниз. Отбил себе пальцы. Что я делаю не так"

Roman
24.04.2018
18:25:31

Google

Roman
24.04.2018
18:26:47
чтоб понимать какие из параметров были неверными, а не вслепую гадать почему не выполнилась мутация
сейчас добавил OPTIONAL перед MATCH и уже лучше, теперь валится с ошибкой:
Expected to find a node at f but found nothing Some(NO_VALUE)
но это тоже не особо устраивает, ибо невозможно понять какая именно из сущностей не была найдена, парсить текстовые ошибки же не будешь..

Al
24.04.2018
18:29:35

Roman
24.04.2018
18:30:47
В чем проблема парсить?
Вы серьёзно предлагаете текстовые ошибки парсить? чтоб если в Neo4j они изменились весь сервер полетел? И сложный regexp или парсер? ну нахер..
лучше просто вернуть поле notFound со значением мол second или first или null если всё окей

Al
24.04.2018
18:31:42
Нео и так еле шевелится. А тут еще и логику ей подсунуть
Да она в нее могет. Только толку от этого нуль.

Roman
24.04.2018
18:32:41

Al
24.04.2018
18:33:13
А не заниматся извращениями

Roman
24.04.2018
18:33:43
дак это 3 round-trip'а к бд туда сюда плюс транзакция..
это же дороже выйдет чем 1 query с небольшой совсем логикой, я же не Pi в 100500 степени на cypher высчитываю

Al
24.04.2018
18:35:36
Для справки. Нео считает достижением 1700 запросов в секунду на кластере из 3 серверов!!!

Roman
24.04.2018
18:37:10
мдауж
я просто из SQL привык выполнять всё что можно выполнить в SQL - там, нежели создавать лишние round-trip'ы и транзакции
Neo настолько плохо оптимизирован?

Google

Al
24.04.2018
18:38:14
мдауж
Дык прежде чем вестись на их маркетинг нужно смотреть самому
На стороне приложения любая логика решается НА ПОРЯДКИ быстрее
Да начнется говсрач :)

Roman
24.04.2018
18:41:19
round-trip по идее должен быть дороже чем жалкий if-else в cypher

Al
24.04.2018
18:43:33
Так что простые селекты всегда будут дешевле

Roman
24.04.2018
18:46:12
короче ещё недостаточно оптимизирован
блљtß...
но вот если делать тогда первый query аля
MATCH (f:First),(s:Second),(t:Third)
WHERE f.id="1" AND s.id="2" AND t.id="3"
AND "banana" in t.roles
RETURN f.id, s.id, t.id
тогда опять вернёт (no changed, no records) в случае если один из параметров был неверен..
ну не делать жи 3 round-trip'а для каждого entity....?!


Al
24.04.2018
19:00:48
ну не делать жи 3 round-trip'а для каждого entity....?!
Следи за руками. Нужно было находить общюю ноду для двух при соблюдении 1 условия в релейшенах
Было нео4жыы. И запрос в 1 строчку.
Обработка 7 тысяч обьектов занимала 3 суток... 3 суток Карл.
Переделал. Стал запрашивать список исходящих релейшенов для каждой ноды и сравнивать в приложении списки.. и потом дополнительно еще запрашивать уточнения. Количество запросов заместо одного стало в среднем 10 000..
Обработка тех же 7к обьектов стала около 8 часов!!!
Перетащил все в janusgraph.
Обработка тех же 7к обьектов стала около часа!!!
Переколбасил всю структуру хранения. Но оставил всю логику в приложении.
Обработка тех же 7к обьектов занимает около 20 секунд!!!


Roman
24.04.2018
20:10:44
@AlexCAD если одним round-trip'ом попытаться запросить нужные узлы:
MATCH (f:First),(s:Second)
WHERE f.id = "1" AND s.id = "2"
RETURN f.id, s.id
тогда если один из id'шников окажется неверным - оба поля будут null
т.е. опять не понятно какая из сущностей не существует

Al
24.04.2018
20:14:22

Roman
24.04.2018
20:15:07
это же типа "возьми всё и отфильтруй 99%"

Al
24.04.2018
20:15:30

Google

Roman
24.04.2018
20:16:03

Al
24.04.2018
20:17:18
Блин вставь свой match и через case верни цифру например. По ней будешь знать чего нет.
Вообще дурацкий запрос. Зачем знать что нет одной из нод

Roman
24.04.2018
20:18:07

Al
24.04.2018
20:18:38

Roman
24.04.2018
20:19:01

Admin
ERROR: S client not available

Roman
24.04.2018
20:19:27
функция будет проходить без ошибки, а мутация будет не выполнена
якобы всё окей)

Al
24.04.2018
20:19:44

Roman
24.04.2018
20:22:09
Это все зависит от задачи в целом. Пока я знаю что в нео должна случатся какая то мутация
1. нужно выполнить мутацию на узлах A, B и C
2. каждый из узлов обладает свойством идентификатором UUIDv4
3. прежде чем выполнять мутацию, нужно проверить существование A, B и C. Иначе сервер не вернёт ошибки и все будут думать мол операция прошла успешно, хотя нан самом деле никакой мутации не произошло.
4. было бы полезно знать, какой объект из A, B или C не существовал, какой из идентификаторов был неверным

Al
24.04.2018
20:24:00

Roman
24.04.2018
20:33:44
этот query вернёт null только для конкретно несуществующих узлов
короче сделаю в 2 трипа через транзакцию
1. начать транзакцию
2. проверить существование узлов, вернуть ошибку если одна или несколько не существуют, указывая в ошибке на конкретные несуществущие id
3. провести мутацию
4. закомитить транзакцию

Denis
24.04.2018
21:03:32
О парень транзакции в нео оооочень медленные

Al
24.04.2018
22:00:33
О парень транзакции в нео оооочень медленные
Он верит что все что можно нужно пхать в запрос базе... :) и пусть она сдохнет.
Нужно к клавиатурам делать крышку как у роялей.. что бы хрясь по пальцам... и одним разрабом меньше. Гы

Philipp
25.04.2018
12:58:54
Добрый день. Ребятки, а можно в качестве Алиаса для колонки делать подвыборку?
Например:
SELECT
p.id, p.title,
p.value AS (SELECT title FROM attributes WHERE id = 1)
FROM
products p

Виктор
25.04.2018
12:59:31
Чего добиться хотите, это же маразм

lost
25.04.2018
12:59:59
Это не маразм, а иногда нормальное решение

Google

lost
25.04.2018
13:00:19

Philipp
25.04.2018
13:01:12

lost
25.04.2018
13:01:36
Только альяс после подзапроса должен быть

Vladislav
25.04.2018
13:01:42
что за бред написан?
зачем вам в названии колонки запрос?

Виктор
25.04.2018
13:02:17

lost
25.04.2018
13:02:41

Vladislav
25.04.2018
13:02:45
если хотите значение получить, то value надо поменять местами с запросом

Philipp
25.04.2018
13:02:55
Чего добиться хотите, это же маразм
Отнюдь. У меня конструктор для создания электронных компонентов, название свойств заранее не определены, а выбираются из базы и по EAV генерируется таблица.

Vladislav
25.04.2018
13:02:59

lost
25.04.2018
13:03:21
ну синтаксически он написан неверно, я согласен

Vladislav
25.04.2018
13:03:26
вот поменяете местами, тогда ОК, вопросов нет, а сейчас какая-то херня

Ilia
25.04.2018
13:03:55

lost
25.04.2018
13:03:56
SELECT
p.id, p.title,
(SELECT title FROM attributes WHERE id = 1) AS value
FROM
products p
вот так кошерно будет

Vladislav
25.04.2018
13:04:42