Хобрук: Ваш путь к мастерству в программировании

Возврат результатов, если хотя бы один узел (связанный, но, возможно, не являющийся результатом) имеет определенное свойство в Neo4j.

У меня есть граф, состоящий из набора непересекающихся генеалогических деревьев.

У меня есть рабочий запрос с несколькими операторами 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, я бы попытался использовать временную таблицу для передачи данных.

Ничего из этого на самом деле не работает.

Спасибо, что прочитали это.

02.09.2016

Ответы:


1

[ОБНОВЛЕНО, чтобы ответить на обновленный вопрос]

Этот запрос может сработать для вас (или ему может не хватить памяти или он будет выполняться вечно):

MATCH (p:Person {main_person: 'y'})
  WHERE EXISTS((p)-[*0..]-({test_me: '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, COLLECT(parent) AS parents, COLLECT(sib) AS sibs;

Синтаксис [*0..] обозначает поиск отношения переменной длины, где совпадающие пути могут иметь 0 или более отношений. Причина, по которой запрос использует нижнюю границу 0 вместо 1 (которая используется по умолчанию), заключается в следующем: мы также хотим проверить, имеет ли само p желаемое значение свойства test_me.

Однако поиск взаимосвязей переменной длины печально известен тем, что использует много памяти или требует много времени для завершения, когда не указана верхняя граница, поэтому обычно в запросе указывается разумная верхняя граница (например, [*0..5]) .

Кстати, вам, вероятно, следует передавать такие значения, как 'y', в качестве параметров вместо их жесткого кодирования.

02.09.2016
  • Киберсам, я должен извиниться перед тобой. Я очень благодарен, что вы ответили на этот вопрос, но мне пришлось вернуться и внести изменения в вопрос. Я сожалею об этом!!! 03.09.2016
  • Это действительно интересно. Я заметил, что порядок операторов OPTIONAL MATCH имеет большое значение. В моей «реальной» задаче порядок был обратным, и я не получил никаких результатов. В конце концов я изменил порядок, и он сработал, как и ожидалось. В любом случае, еще раз спасибо за ваше терпение и помощь. 03.09.2016

  • 2

    Вы определенно на правильном пути, я думаю, что у вас уже есть ответ, даже если вы этого не осознаете.

    То, что у вас есть в вашем описании, работает как начало вашего запроса, с несколькими изменениями:

    MATCH pattern=(p:Person{main_person: 'y'})-[*]-()
    WHERE ANY (person IN nodes(pattern) WHERE person.test_me = 'y')
    WITH p
    ...
    

    Переменная связь позволяет вам рассматривать каждого человека в дереве (если на вашем графике есть несемейные отношения, вам нужно использовать типы для ваших отношений, чтобы убедиться, что вы рассматриваете только одно семейное дерево), а также главный_человек. Если ни у кого в генеалогическом дереве p нет желаемого свойства, p будет нулевым, и любые последующие сопоставления с использованием p не дадут результатов. Это должно позволить вам свободно указать остальную часть запроса, и пока все совпадения включают p, вы не должны получать в конце никаких результатов для семейств без желаемого значения свойства.

    EDIT немного исправил мой запрос, предложение ANY() было написано неправильно.

    02.09.2016
  • похоже что-то в nodes(pattern) замедляет работу 03.09.2016
  • Вы можете отменить и запустить EXPLAIN для запроса, чтобы увидеть, где что-то не работает. Некоторые другие вещи, которые нужно проверить... любое свойство, которое вы используете для сопоставления с конкретным человеком (вашим main_person), должно быть уникально ограничено. Вы также можете проверить размер дерева, с которым вы сопоставляетесь, из main_person, поскольку отношения переменных будут охватывать весь связанный подграф. Является ли каждое генеалогическое древо полным подграфом или существуют отношения, выходящие за рамки генеалогического древа и, возможно, связывающие больше узлов в вашем графе, чем те, которые вы хотите найти? 03.09.2016
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..