neo4j: как импортировать и создавать много связей - PullRequest
0 голосов
/ 01 мая 2018

Я получил основы Neo4j Desktop. Это производственный случай: у нас есть идентификаторы рабочих процессов. Когда задание рабочего процесса завершается, запускается другое задание. Это отношения.

У меня уже определено 300 заданий WF, теперь мне просто нужно создать 800 отношений. Я могу сделать по одному за раз. Например, это работает:

MATCH (u) WHERE u.WF_ID = 7 
MATCH (v) WHERE v.WF_ID = 8
CREATE (u)-[:TRIGGERS]->(v) return u,v;

Но если я возьму целую кучу команд, подобных приведенной выше, скопирую и вставлю в браузер или импортирую файл, я получу ошибки. Я пытался так:

MATCH (u) WHERE u.WF_ID = 8 
MATCH (v) WHERE v.WF_ID = 10 
CREATE (u)-[:TRIGGERS]->(v)

MATCH (u) WHERE u.WF_ID = 11 
MATCH (v) WHERE v.WF_ID = 12 
CREATE (u)-[:TRIGGERS]->(v)

MATCH (u) WHERE u.WF_ID = 11 
MATCH (v) WHERE v.WF_ID = 14 
CREATE (u)-[:TRIGGERS]->(v)

return u,v

И я получаю:

WITH is required between CREATE and MATCH (line 2, column 1 (offset: 85))
"MATCH (u) WHERE u.WF_ID = 11 MATCH (v) WHERE v.WF_ID = 12 <br>CREATE (u)-[:TRIGGERS]->(v)"

Я смотрю документацию Cypher по WITH, но она не помогает мне понять, что мне нужно для этого случая.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 01 мая 2018

WITH также используется для отделения чтения от обновления графика. Каждая часть запроса должна быть доступна только для чтения или только для записи. когда переход от записывающей части к читающей части, переключение должно быть сделано с предложением WITH.

https://neo4j.com/docs/developer-manual/current/cypher/clauses/with/#with-introduction

Так что вам нужно добавить WITH между частями (нам нужна промежуточная переменная result, потому что в противном случае вернется только последний результат):

MATCH (u) WHERE u.WF_ID = 8 
MATCH (v) WHERE v.WF_ID = 10 
CREATE (u)-[r:TRIGGERS]->(v)
WITH [[u, v, r]] AS result

MATCH (u) WHERE u.WF_ID = 11 
MATCH (v) WHERE v.WF_ID = 12 
CREATE (u)-[r:TRIGGERS]->(v)
WITH result + [[u, v, r]] AS result

MATCH (u) WHERE u.WF_ID = 11 
MATCH (v) WHERE v.WF_ID = 14 
CREATE (u)-[r:TRIGGERS]->(v)
WITH result + [[u, v, r]] AS result

RETURN result

Но этот вариант запроса уродлив. Поскольку результат каждой части не используется в следующей, мы можем использовать UNION:

MATCH (u) WHERE u.WF_ID = 8 
MATCH (v) WHERE v.WF_ID = 10 
CREATE (u)-[r:TRIGGERS]->(v)
RETURN u, v, r

UNION

MATCH (u) WHERE u.WF_ID = 11 
MATCH (v) WHERE v.WF_ID = 12 
CREATE (u)-[r:TRIGGERS]->(v)
RETURN u, v, r

UNION

MATCH (u) WHERE u.WF_ID = 11 
MATCH (v) WHERE v.WF_ID = 14 
CREATE (u)-[r:TRIGGERS]->(v)
RETURN u, v, r

Или мы можем сделать запрос еще более компактным, используя UNWIND:

WITH [[8, 10], [11, 12], [11, 14]] AS pids

UNWIND pids AS ids

    MATCH (u) WHERE u.WF_ID = ids[0] 
    MATCH (v) WHERE v.WF_ID = ids[1]
    CREATE (u)-[r:TRIGGERS]->(v)

RETURN u, v, r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...