У меня есть граф, состоящий из набора непересекающихся генеалогических деревьев.
У меня есть рабочий запрос с несколькими операторами OPTIONAL MATCH
, которые позволяют мне получить только непосредственных родителей и братьев и сестер кого-то из генеалогического древа main_person
, предполагая, что эти родственники представляют для нас интерес:
MATCH (p:Person {main_person: 'y'})
OPTIONAL MATCH (p)<-[]-(parent:Person)
WHERE parent.`person_of_interest` = 'y'
OPTIONAL MATCH (parent:Person)-[]->(sib:Person)
WHERE sib <> p
AND sib.`person_of_interest` = 'y'
RETURN
p, parent, sib;
Но скажем, я хочу уточнить это, убедившись:
- по крайней мере один член семьи имеет свойство
test_me = 'y'
. Это может быть очень далекий член семьи. Это определенно не обязательно должен быть член семьиperson_of_interest
или близкий член семьи.
Если хотя бы один из них обладает этим свойством, то мы можем вернуть искомых членов семьи. Но если ни у кого нет собственности, то мы не хотим никаких результатов для этой семьи.
Я не уверен, как это построить. Я продолжаю пытаться начать с части test_me = 'y'
и продолжить ее с WITH
:
MATCH (p:Person)-[]-(m)
WHERE ANY m.test_me = 'y'
WITH p, m
. . .
Может быть, это должно быть больше похоже на:
MATCH (p:Person {main_person: 'y'})
OPTIONAL MATCH (p)<-[]-(parent:Person)
OPTIONAL MATCH (parent:Person)-[]->(sib:Person)
WHERE sib <> p
HAVING <condition here>
RETURN
p, parent, sib;
Если бы это был SQL, я бы попытался использовать временную таблицу для передачи данных.
Ничего из этого на самом деле не работает.
Спасибо, что прочитали это.
OPTIONAL MATCH
имеет большое значение. В моей «реальной» задаче порядок был обратным, и я не получил никаких результатов. В конце концов я изменил порядок, и он сработал, как и ожидалось. В любом случае, еще раз спасибо за ваше терпение и помощь. 03.09.2016