Neo4j Соединение нескольких отношений между несколькими узлами - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь добиться того, что показано здесь: У меня есть 2 CSV-файла, diease_mstr и Test_mstr. Сейчас в Test_mstr у меня есть много тестов для записей идентификаторов болезней, что означает, что ни одна из них не является уникальной.Идентификатор болезни указывает на файл AIDS_MSTR.В файле AIDS_MSTR у меня есть только 2 поля: ID и Disease_name (имя болезни уникально).

Теперь я создаю 3 узла с метками 1) Тесты (только свойство "testname"), которые будут иметь уникальные тесты (всего 345 уникальных имен тестов)

**Properties :**
a) testname

2) Linknode (вытащил весь файл Test_mstr) также вытащил «Идентификатор_домена» для соответствующего IP-идентификатора болезни из файла Disease_mstr

**Properties**
a)tname
b)dname
c)did

3) Болезнь (перетянутая форма болезнь_mstr) файл.

**Properties**
a)did
b)diseasename

После чего я запускаю команду создания отношений

1)MATCH (t:Tests),(n:Linknode) where t.testname = n.tname CREATE (n)-[r:TEST_2]->(t) RETURN n,r,t

2)MATCH (d:Disease), (l:Linknode) where d.did = l.did MERGE (d)-[r:FOR_DISEASE]->(l) RETURN d,r,l

Чтобы получить желаемый результат, как показано на рисунке, я запускаю следующую команду шифрования:

MATCH (d:Disease)-[r2:FOR_DISEASE]->(l:Linknode)-[r:TEST_2]->(t:Tests) RETURN l,r,t,r2 LIMIT 25

Может ли кто-нибудь помочь мне создать еще 2 отношения, которые отмечены и связаны на изображении синими и зелеными линиями ?.

С примерами файлов и изображений можно ознакомиться по ссылке в папке google

1 Ответ

0 голосов
/ 11 июня 2018

Ваша цель состоит в том, чтобы связать все заболевания с тестами, чтобы при любом заболевании вы могли выяснить, какие тесты актуальны и для каждого теста, на какие заболевания он тестируется?

Если это так, вы почти на месте.

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

Вот пошаговый способ загрузки вашей базы данных.(Возможно, он не самый эффективный, но за ним легко следить, и он работает.)

Нормализуйте и загрузите ваши тесты:

load csv with headers from "file:///test_mstr_csv.csv" as line
merge (:Test {testname:line.test_name});

Загрузите ваши болезни (эти показания мне нормализовались)

load csv with headers from "file:///disease_mstr_csv.csv" as line
create (:Disease {did:line.did, diseasename:line.disease_name});

Загрузите узлы ссылок:

load csv with headers from "file:///test_mstr_csv.csv" as line
merge (:Link {testname:line.test_name, parentdiseaseid:line.parent_disease_ID});

Теперь вы можете создать прямую связь между болезнями и тестами с помощью следующего запроса:

match(d:Disease), (l:Link) where d.did = l.parentdiseaseid
with d, l.testname as name
match(t:Test {testname:name}) create (d)<-[:TEST_FOR]-(t);

Этот последний запрос найдет все узлы ссылки для каждого заболевания и извлечет название теста.Затем он просматривает тест и присоединяет его непосредственно к соответствующему заболеванию.

Узлы ссылок теперь избыточны, поэтому вы можете удалить их, если хотите.

Чтобы создать «синие линии»Я полагаю, что для определения общих заболеваний в тестах запустите следующий запрос:

match (d:Disease)<-[]-(:Test)-[]->(e:Disease) where id(d) > id(e) 
merge (d)-[:BLUE_LINE]->(e);

Предложение match находит все пары заболеваний с общим тестом, где предложение обеспечивает создание ссылки только в одном направлении, а предложение merge обеспечивает создание только одной ссылки.

...