Возврат нового графика с помощью Cypher или OpenCypher - PullRequest
0 голосов
/ 15 сентября 2018

Этот вопрос возник из опыта работы с оператором CONSTRUCT в SPARQL, который позволяет брать привязки переменных в запросе графа и возвращать новый граф в качестве результата.

Есть ли что-нибудь подобное в Cypher / OpenCypher?

Я имею в виду, предположим, у вас есть:

react1 - [part-of] -> pathway1
mol1 - [consumed-by] -> react1
mol2 - [consumed-by] -> react1
mol3 - [produced-by] -> react1

Я хотел бы вернуть упрощенный график, например:

pathway1 - [input] - mol1
pathway1 - [input] - mol2
pathway1 - [output] - mol3

Обратите внимание, что я уже поиграл с WITH/COLLECT/UNWIND, чтобы получить структуры JSON, очень похожие на приведенный выше график, но этот подход гораздо сложнее написать.

1 Ответ

0 голосов
/ 15 сентября 2018

Вы можете поэкспериментировать с virtual relationships, используя APOC library.

Например, у вас есть следующие тестовые данные:

MERGE p1 = (R:react {name:'react_1'})-[:`part-of`] ->(:pathway {name: 'pathway_1'})
MERGE p2 = (:mol {name: 'mol_1'})-[:`consumed-by`]->(R)
MERGE p3 = (:mol {name: 'mol_2'})-[:`consumed-by`]->(R)
MERGE p4 = (:mol {name: 'mol_3'})-[:`produced-by`]->(R)
RETURN *

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

MATCH (R:react)
MATCH (R)-[rp:`part-of`]-(p:pathway)
MATCH (m:mol)-[mr]-(R)
WITH p, m, mr,
     CASE WHEN type(mr) = 'consumed-by' 
          THEN {from: p, type: "input",  props: properties(mr), to: m}
          WHEN type(mr) = 'produced-by'
          THEN {from: m, type: "output", props: properties(mr), to: p}
     END AS vRel
WITH vRel WHERE vRel IS NOT NULL
CALL apoc.create.vRelationship(
  vRel.from,
  vRel.type,
  vRel.props,
  vRel.to
) YIELD rel
RETURN vRel.from, rel, vRel.to

Что даст следующий результат:

enter image description here

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