Сайферная сортировка по количеству связанных узлов? - PullRequest
0 голосов
/ 28 апреля 2020

Я изучаю Cypher, и я создал проект "Уголовное расследование" на Neo4j.

Я пытаюсь выполнить запрос, который выводит каждый Person, который имеет two дети (Person) и оба ребенка должны были совершить преступление. Чтобы добиться этого, я тестировал некоторые запросы с Person (p) с именем p.name = "Lillian", поэтому я знаю, что у этого человека двое детей, но только один из них совершил преступление.

Чтобы заставить это выполнить этот запрос (вернуть что-то, если у Лилиан есть два сына, которые совершили преступления, или ничего не вернуть:

match (p:Person)-[r:FAMILY_REL]->(s:Person)
where p.name = "Lillian" 
and size((p)-[:FAMILY_REL]->()-[:PARTY_TO]->(:Crime))=2 and size((p)-[:FAMILY_REL]->()) = 2
return p, s

Поскольку я уже знал, что у Лилиан есть только один сын, который совершил преступление, запрос не должен был возвратил что-нибудь, но он вернул обоих своих детей.

Я предполагаю, что здесь неправильная часть запроса:

where /*...*/ and size((p)-[:FAMILY_REL]->()-[:PARTY_TO]->(:Crime))=2

Я думаю, что это подсчет только числа детей вместо количество детей, совершивших преступления.

Как правильно это сделать?

1 Ответ

1 голос
/ 28 апреля 2020

Попробуйте:

MATCH (p:Person)
WHERE p.name = "Lillian" AND size((p)-[:FAMILY_REL]->()) = 2
WITH p, [(p)-[:FAMILY_REL]->(child) WHERE (child)-[:PARTY_TO]->(:Crime) | child] as childCriminals
WHERE size(childCriminals) = 2
UNWIND childCriminals as s
RETURN p, s

Обратите внимание, что это сработает только в том случае, если у Лилиан ровно двое детей, и оба были участниками преступления.

Почему ваш запрос не работал, вполне вероятно, что один из детей был участником двух преступлений, что дало бы результат.

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