2013-03-26 2 views
1

Я моделирую набор узлов, который имеет некоторые иерархические отношения (как отношения PARENT), но дополнительно некоторые неиерархические отношения.neo4j cypher запрос для сопоставления иерархических отношений

Скажем, это семейное дерево с отношениями к стране рождения для каждого человека, для простоты

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

start parent=node(123), child=node(456) 
create parent-[:PARENT]->child; 

и

start person=node(123), country=node(789) 
create person-[:BORN_IN]->country; 

, что я хотел бы сделать это, например, получить список людей, которые не имеют каких-либо предков из Англии, или Fol ks, у которых есть предок из Японии или тому подобное. Я чувствую, что это должен быть разумный запрос, но я новичок в cypher и не знаю, как его построить.

UPDATE ** После более обширное тестирование случаев, я обнаружил, что запрос не работает совершенно верно в некоторых. Учитывая, что ребенок с одним родителем из Англии и бабушка и дедушка не из Англии, запрос для детей без каких-либо предков из Англии неправильно возвращает ребенка с родителем из Англии. Похоже на то, как я написал запрос, я получаю возврат для дедушки и бабушки, имеющих отношение NULL к англии. Мой запрос выглядит следующим образом:

START n=node(*), ancestor=node(123) 
MATCH n-[r:PARENT*]->o-[b?:BORN_IN]->ancestor 
WHERE b IS NULL 
RETURN DISTINCT n; 

Если все предки этого лица родились в стране, о котором идет речь, он отлично работает.

ответ

4

Вы можете использовать отношение переменной длины для включения всех детей/предков. Я просто выбрал «люди, у которых есть предок из Японии»:

START country=<lookup Japan> 
match (child)-[:PARENT*0..5]->(parent)-[:BORN_IN]->(country) 
return child 

Примечание: не пробовал, но логически это должно сделать это. Кроме того, я выбрал случайную глубину 5.

MATCH a-[:PARENT]->b-[:BORN_IN]->z 

, как указан в вашем примере должны найти все лицо (а), у кого из родителей рожденных в г

Если набор данных удобно на консоли .neo4j.org, может быть, мог бы посмотреть, что происходит.

+0

Спасибо, что сработало отлично. Проблема с моим примером запроса оказалась в том, что я толкнул имя rel. – Paul

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