2016-08-20 4 views
0

Я хочу написать sem join query в cypher. Например, я хочу, чтобы найти профессор, такие, что профессор имеет по крайней мере один студент с более чем 9.0 класса в следующий графике: Sample Graphкак писать запросы на полу-соединение в cypher?

Так выход должен быть следующим для образца Графика:

P2 
P3 

Это будет сделан в SQL в следующем образе:

Select Professor.name 
From Professor 
where exists (
       select * from Student 
       where Student.grade >= 9.0 and 
       Student.guide_id = Professor.id 
      ) 

ответ

1

Пусть, например, мы добавляем данных о преподавателях и студентах следующим образом:

UNWIND RANGE(1,1000) as i 
WITH 'professor_' + toInt(rand()*20) as pname, 
     'student_' + i as sname 
MERGE (P:Professor:Person {name: pname}) 
MERGE (S:Student:Person {name: sname}) SET S.grade = rand()*10 
MERGE (P)-[:guide]->(S) 

Запрос список профессоров, чьи студенты имеют класс> = 9.0:

MATCH (P:Professor)-[:guide]->(S:Student) WHERE S.grade >= 9.0 
RETURN distinct P 
+0

спасибо за ответ. Но этот запрос cypher применяется «отлично», что будет очень дорогостоящей операцией, если размер (P: Professor) - [: guide] -> (S: Student) большой. Я искал запрос, который начинается с профессора и переходит к студенческим узлам, используя края и проверяя состояние учащихся. Если это возможно, ответьте на это. –

+1

@SumitNeelam Я думаю, что это лучший вариант. –

+0

@ stdob-- Я думаю, что что-то не так с твоим кодом Cypher. Я вижу несколько узлов профессора с одинаковыми именами ... Я думаю, что у студентов, вероятно, есть такая же проблема. Это похоже на то, что заявления MERGE на самом деле не сливаются. Есть ли какое-то странное взаимодействие, когда задействованы расчетные значения? – InverseFalcon

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