Непонимание запроса на шифрование в Neo4j - PullRequest
0 голосов
/ 30 апреля 2018

Посмотрите на следующий примерный график (из ссылки Neo4j):

image

И еще один запрос:

MATCH (david { name: 'David' })--(otherPerson)-->()
WITH otherPerson, count(*) AS foaf
WHERE foaf > 1
RETURN otherPerson.name

Результат:

"Anders"

Я не могу понять, почему этот результат был возвращен. Прежде всего,
что это значит:

MATCH (david { name: 'David' })--(otherPerson)-->()
WITH otherPerson, count(*) AS foaf

В частности, Bossman также имеет (как Anders) два исходящих ребра и подключен к David.

Может кто-нибудь объяснить мне семантику этого запроса?

1 Ответ

0 голосов
/ 30 апреля 2018

Итак, как вы заметили, есть два узла, которые выглядят так, как будто они соответствуют описанному вами шаблону. И Андерс, и Боссман связаны с Давидом, и оба имеют два исходящих отношения.

Что вам не хватает, так это то, что с шаблонами 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

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

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