Как заменить декартовы произведения, когда они нужны мне для создания объединенных узлов? - PullRequest
0 голосов
/ 23 мая 2018

Итак, я работаю с набором данных управления программами, в котором не так много записей (в младших тысячах), но все еще много зависает, когда я пытаюсь визуализировать несколько типов отношений.У меня есть индексы, такие как ID проекта, но я думаю, что медлительность связана с тем, что мне приходится создавать временный набор узлов проекта (CREATE), чтобы сопоставить разные организации с постоянными узлами проекта (на основе MERGE).на ProjectID).Предполагая, что у меня уже есть загруженные узлы организации, код выглядит следующим образом:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///Project.csv" AS p
CREATE (:ProjectTemp {
Project_ID: toString(p.ProjectId),
Project_Name: toString(p.ProjectTitle),
Org_ID: toString(p.`Org ID`) })

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///Project.csv" AS row
MERGE (p:Project {Project_ID: toString(row.ProjectId),
Project_Name: toString(row.ProjectTitle) })

MATCH (o:Organization), (pt:ProjectTemp),(p:Project) 
WHERE o.Org_ID=pt.Org_ID AND pt.Org_Role='Lead Recipient' AND 
pt.Project_ID=p.Project_ID 
MERGE (o)-[:LEAD]->(p) 

Есть ли способ не использовать узлы Project Temp для сопоставления и предотвращения проблемы декартовых продуктов?Или есть способ сделать это быстрее / эффективнее?Мне нужно поддерживать несколько отношений (например, Sub, Vendor), а не только Lead.Также причина, по которой мне нужны временные узлы, потому что есть свойства, которые имеют некоторые записи с одним и тем же идентификатором проекта, но не другие, которые определяют, как организация связана с проектом.По сути, я хочу объединить ProjectID, чтобы все отношения указывали на один и тот же проект, при этом сохраняя свойства на уровне отдельных записей для правильного соответствия организациям, но пока я думал только об этом, используя временные узлы.

Спасибо!

1 Ответ

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

Непонятно, зачем вам нужны ProjectTemp узлы.

Например, если вы убедились, что каждый узел Project существует, и что каждый узел имеет отношение HAS_PROJECT справа Organization вот так:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///Project.csv" AS row
MATCH (o:Organization) WHERE o.Org_ID = row.`Org ID`
MERGE (p:Project {Project_ID: row.ProjectId})
ON CREATE SET p.Project_Name = row.ProjectTitle
MERGE (o)-[:HAS_PROJECT]->(p)

Тогда ваш последний запрос (для добавления всех отношений LEAD) даже не понадобится.Вместо этого, всякий раз, когда вам нужно было найти отведение Project s для Organization, вам просто нужно сделать что-то вроде этого:

MATCH (o:Organization)-[:HAS_PROJECT]->(p:Project) 
WHERE o.Org_ID = "123" AND p.Org_Role='Lead Recipient' 
...

Чтобы сделать вышеописанное эффективным, у вас должны быть индексы на:

  • : организация (Org_ID)
  • : проект (Project_ID)
...