2016-03-29 2 views
0

Создано GraphGist, чтобы объяснить мою проблему:Cypher Query для всех узлов, которые имеют общие отношения с двумя или более под-узлами?

https://gist.github.com/bconneen/e5c66e26883958c81ae6fc5c607fdfa9

Рассмотрим следующую модель Neo4j:

Applicant(firstName, lastName, uniqueId) 
Phone(number) 
IpAddress(ip) 
BankAccount(routing,account) 

Applicant--has->Phone, 
Applicant--has->IpAddress, 
Applicant--has-->BankAccount 

Все узлы создаются с помощью слияния. Поэтому, если мы обработаем 100 000 приложений, отношения будут созданы, когда изредка более 1 заявитель делится одним или несколькими телефонами, IpAddress, BankAccount.

Я хочу, чтобы узлы вернулись, когда 2 или более заявителей делят 2 или более Телефон, IpAddress или BankAccount. Я хочу написать запрос, который возвращает All Applicants и их общие отношения. Это соответствует критериям.

Пример:

Заявитель (John Smith) имеет телефон (555-555-5555), имеет Ipaddress (127.0.0.1), имеет BankAccount (ABCDEF)

Заявитель (Jane Doe) имеет Телефон (222-222-2222, имеет ipAddress (127.0.0.1), имеет BankAccount (ABCDEF)

Соискатель (Steve Zahn) имеет телефон (555-555-5555), имеет ipAddress (127.2.2.2), имеет BankAccount (GHJKD)

Кандидат (Джеймс Клэй) имеет Pho пе (444-444-4444), имеет Ipaddress (129.3.3.3), имеет BankAccount (ZYXWVU)

запросов для всех кандидатов, которые разделяют 2 или больше телефон, Ipaddress или банк:

Заявителя (John Смит) имеет телефон (555-555-5555), имеет ipAddress (127.0.0.1), имеет BankAccount (ABCDEF)

Кандидат (Джейн Доу) имеет телефон (222-222-2222, имеет ipAddress (127.0.0.1) , имеет BankAccount (ABCDEF)

Запрос для всех Заявителей, которые имеют 1 или больше Телефон, IpAddress или Банк:

Заявитель (John Smith) имеет телефон (555-555-5555), имеет Ipaddress (127.0.0.1), имеет BankAccount (ABCDEF)

Заявитель (Jane Doe) имеет телефон (222-222-2222 , имеет Ipaddress (127.0.0.1), имеет BankAccount (ABCDEF)

Заявитель (Стив Зан) имеет телефон (555-555-5555), имеет Ipaddress (127.2.2.2), имеет BankAccount (GHJKD)

ответ

2

Используя данные из вашего списка:

Запрос на все заявки ц, что доля 2 или более телефон, IP-адрес или банк

MATCH (applicant:Applicant)-[r]->(subelement)<-[r2]-(other:Applicant) 
WITH applicant, other, collect(subelement) AS overlap 
WHERE id(applicant) > id(other) AND size(overlap) > 1 
RETURN applicant, other, overlap 

enter image description here

+0

Спасибо за ответ. Могу ли я спросить купе уточняющих вопросов? A) Что делает эта часть: «WHERE id (претендент)> id (другой)»? B) Если я правильно понимаю, он возвращает только 2 заявителя.Даже если более двух человек используют одну и ту же информацию? – bconneen

+0

Еще раз спасибо за помощь. Я представил Gist здесь: http://portal.graphgist.org/graph_gists/6de21406-ca93-47ff-ab66-526e73ea6c12 – bconneen

+1

исключает дубликаты – Evgen

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