2015-06-30 4 views
0

Имея график, в котором молекулы присоединены к общей эшафоте с отношениями [: substructureOf] и где подобные молекулы связаны с eachothers с отношением [: isSimilarTo], является способом вернуть все [: isSimilarTo] отношения для определенного подмножества молекул?Как найти все отношения в cypher

В псевдокоде шифровальщика, рассматривая м как совокупность (подмножество молекул), хотелось бы оценить, что m1 и m2 каждой сим отношений является частью м

MATCH (:Scaffold {Name: 'A'}) <-[:usbstructureOf]- (m:Molecule) 
WITH m MATCH (m1:Molecule) -[sim:isSimilarTo]- (m2:Molecule) 
WHERE m1 IN m AND m2 IN m 

Есть ли собственно Шифр ​​способ написать это? Пример набора данных ниже.

CREATE (:Scaffold {Name: 'A'}); 
CREATE (:Scaffold {Name: 'B'}); 
MATCH (s:Scaffold {Name: 'A'}) MERGE (s) -[:substructureOf]->(:Molecule {Name: 'm1'}); 
MATCH (s:Scaffold {Name: 'A'}) MERGE (s) -[:substructureOf]->(:Molecule {Name: 'm2'}); 
MATCH (s:Scaffold {Name: 'A'}) MERGE (s) -[:substructureOf]->(:Molecule {Name: 'm3'}); 
MATCH (s:Scaffold {Name: 'A'}) MERGE (s) -[:substructureOf]->(:Molecule {Name: 'm4'}); 
MATCH (s:Scaffold {Name: 'B'}) MERGE (s) -[:substructureOf]->(:Molecule {Name: 'm5'}); 
MATCH (m:Molecule {Name: 'm1'}), (n:Molecule {Name: 'm2'}) CREATE (m) -[isSimilarTo]-> (n); 
MATCH (m:Molecule {Name: 'm1'}), (n:Molecule {Name: 'm3'}) CREATE (m) -[isSimilarTo]-> (n); 
MATCH (m:Molecule {Name: 'm2'}), (n:Molecule {Name: 'm3'}) CREATE (m) -[isSimilarTo]-> (n); 
MATCH (m:Molecule {Name: 'm3'}), (n:Molecule {Name: 'm4'}) CREATE (m) -[isSimilarTo]-> (n); 
MATCH (m:Molecule {Name: 'm4'}), (n:Molecule {Name: 'm5'}) CREATE (m) -[isSimilarTo]-> (n); 
+1

Я не понимаю ваш вопрос. Вы просто хотите, чтобы все похожие молекулы были теми, которые вы «MATCH» в первом запросе? Больше ограничений? Объясните. –

+0

На самом деле, я хочу получить все отношения подобия. В указанную дату m1, m2, m3 и m4 разделяют эшафот A. Мне хотелось бы знать, похож ли m1 на m2, m3 и m4, а также на то, насколько m2 похожа на m3 и m4 и т. Д., Но я без заботы являются ли m1-m4 похожими на m5. Трудность - мне - это дважды пройти m1-m4. Идея псевдокода заключается в ограничении на ребрах подобия, в которых начальный и конечный узлы являются частью набора m1-m4. Как правильно написать это в cypher, это мой вопрос. – Pierre

+0

На самом деле псевдокод мог работать, если m был коллекцией, а не узлом. С collect (m) MATCH ... – Pierre

ответ

1

Я все еще не совсем понимаю, что вы хотите, схема сети/чертеж может помочь в следующий раз.

Но я думаю, что вы хотите, чтобы подобные молекулы использовали один и тот же эшафот. То есть все пары Molecule связаны isSimilarTo ребрами, где иMolecules связаны с определенным Scaffold.

Вы можете получить это путем сопоставления полный путь:

(Scaffold)--(Molecule)--(similar Molecule)--(same Scaffold) 

В Cypher:

MATCH (s:Scaffold {Name: 'A'})<-[:isbstructureOf]-(m1:Molecule) 
     -[sim:isSimilarTo]-(m2:Molecule)-[:isbstructureOf]->(s) 
// Return the relationships 
RETURN DISTINCT m1.name, sim.value, m2.name 
// Return count of relationships 
RETURN count(DISTINCT sim) 
+0

Если я задаю вопрос по-другому, в графе peoson/restaurant, в котором люди: LIKES рестораны и: ЗНАЕТ другие люди. Сколько людей: ЗНАЕТ друг друга среди тех, кто: НРАВИТСЯ в конкретный ресторан? Это соответствует подсчету отношения: KNOWS только среди подмножества людей. – Pierre

+0

Вот что делает мой запрос. Возвращайте счет вместо фактических отношений. –

+0

Действительно, я не думал о том, чтобы зациклиться на эшафтах. Работает хорошо. – Pierre

0

Альтернативный ответ:

MATCH (s:Scaffold {Name: 'A'})-[:substructureOf*]->(m:Molecule) 
WITH collect(m) as mols MATCH p=(:Molecule) -[sim:isSimilarTo]- (:Molecule)  
WHERE startNode(r) IN mols and endNode(r) IN mols 
RETURN p 

Общий путь короче.

Смежные вопросы