Итак, как вы заметили, есть два узла, которые выглядят так, как будто они соответствуют описанному вами шаблону. И Андерс, и Боссман связаны с Давидом, и оба имеют два исходящих отношения.
Что вам не хватает, так это то, что с шаблонами Cypher отношения уникальны для шаблона , они не будут использоваться повторно (это на самом деле очень полезно, например, предотвращает бесконечные циклы при использовании переменных-переменных). отношения длины при наличии цикла).
Итак, в этом патче MATCH:
MATCH (david { name: 'David' })--(otherPerson)-->()
отношение, используемое для передачи от Дэвида к Боссману (отношение: BLOCKS), не будет повторно использовано в шаблоне (в частности, часть (otherPerson)-->()
), поэтому вы получите только одну строку результата для этого, в то время как для Андерса вы получит 2. Ваше предложение WHERE исключает совпадение с Bossman, поскольку счет foaf
равен 1.
Один из способов изменить этот запрос, чтобы получить желаемый результат, состоит в проверке степени взаимосвязи в предложении WHERE, а не в шаблоне MATCH. Это также более эффективно, поскольку проверка степеней взаимосвязи не требует выполнения операции расширения, данные степени взаимосвязи находятся на самом узле.
MATCH ({ name: 'David' })--(otherPerson)
WHERE size((otherPerson)-->()) > 1
RETURN otherPerson.name
(также полезно использовать метки узлов в ваших совпадениях, по крайней мере, для предполагаемых начальных узлов. Индексы (если они есть) будут использоваться только в том случае, если вы явно используете и метку, и индексированное свойство в совпадении, не будет работать, когда вы опускаете метку или используете метку, которая не является частью индекса).