Клонировать некоторые отношения в соответствии с условием
Я экспортировал две таблицы с именами Keys и Acc в виде CSV-файлов из SQL Server и успешно импортировал их в Neo4J с помощью приведенных ниже команд.
CREATE INDEX ON :Keys(IdKey)
USING PERIODIC COMMIT 500
LOAD CSV FROM 'file:///C:/Keys.txt' AS line
MERGE (k:Keys { IdKey: line[0] })
SET k.KeyNam=line[1], k.KeyLib=line[2], k.KeyTyp=line[3], k.KeySubTyp=line[4]
USING PERIODIC COMMIT 500
LOAD CSV FROM 'file:///C:/Acc.txt' AS line
MERGE (callerObject:Keys { IdKey : line[0] })
MERGE (calledObject:Keys { IdKey : line[1] })
MERGE (callerObject)-[rc:CALLS]->(calledObject)
SET rc.AccKnd=line[2], rc.Prop=line[3]
Ключи - это объекты исходного кода, Acc - отношения между ними. Я импортировал эти две таблицы три раза для трех разных прикладных проектов. Поэтому, чтобы свойство Id Key было уникальным для трех приложений, я связал пятидисковый префикс с Id Key для идентификации объекта для приложения при экспорте с сервера SQL, поскольку мы не можем создать индекс на основе нескольких полей, как я узнал из руководств. Теперь моя цель - построить отношения между приложениями. Например:
- Node1 - это объект исходного кода Application1
- Node2 - это еще один объект исходного кода Application1
- Node3 - это объект исходного кода Application2
Уже существует связь CALL, созданная с Node1 по Node2, поскольку запись в Acc уже импортирована. Имя Node2 равно имени Node3. Таким образом, мы можем сказать, что Node2 и Node3 фактически являются одинаковыми исходными кодами. Таким образом, мы должны создать отношение от Node1 к Node3. Чтобы понять это, я написал команду ниже. Но я хочу быть уверен, что это правильно. Потому что я не знаю, как долго это будет выполняться.
MATCH (caller:Keys)-[rel:CALLS]->(called:Keys),(calledNew:Keys)
WHERE calledNew.KeyNam = called.KeyNam
and calledNew.IdKey <> called.IdKey
CREATE (caller)-[:CALLS]->(calledNew)
1 ответ
Этот следующий запрос должен быть эффективным, при условии, что вы также создаете индекс для :Keys(KeyNam)
,
MATCH (caller:Keys)-[rel:CALLS]->(called:Keys)
WITH caller, COLLECT(called.KeyNam) AS names
MATCH (calledNew:Keys)
WHERE calledNew.KeyNam IN names AND NOT (caller)-[:CALLS]->(calledNew)
CREATE (caller)-[:CALLS]->(calledNew)
Cypher не будет использовать индекс при сравнении значений свойств. Так что этот запрос ставит все called
имена для каждого caller
в names
сбор, а затем делает сравнение между calledNew.KeyNam
и предметы в этой коллекции. Это приводит к использованию индекса и ускорит идентификацию потенциальных дубликатов, называемых узлами.
Этот запрос также делает NOT (caller)-[:CALLS]->(calledNew)
проверьте, чтобы избежать создания дублирующих отношений между одними и теми же узлами.