Cypher - загрузка результатов при необязательном добавлении количества связей - PullRequest
0 голосов
/ 11 октября 2019

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

Вот пример моей структуры. Где оранжевый - папки, а синий - пользователи. -

graph db structure

Чего я хочу, чтобы мой запрос достиг: Он должен возвращать прямых потомков папки в запросе, и при этомпоэтому определите, является ли общая возвращаемая дочерняя папка общей.

Мой запрос

MATCH (:Folder { name: 'Nick Hamill' })-[:CHILD]->(children:Folder)

WITH children

OPTIONAL MATCH path = (children)<-[*]-(:User)

UNWIND RELATIONSHIPS(path) AS r WITH children, r

WHERE TYPE(r) = 'SHARES'

RETURN children AS model, COUNT(r) > 0 AS shared

Таким образом, запрос работает блестяще (возможно, необходима небольшая оптимизация?) когда есть связанный пользователь (см. ниже), однако, запрос не может вернуть какой-либо результат, если нет отношения с пользователем. Я лично не понимаю, почему это так, потому что это необязательное совпадение, и, конечно, счетчик может просто вернуть пустое значение?

╒══════════════════════════════════════════════════════════════════════╤════════╕
│"model"                                                               │"shared"│
╞══════════════════════════════════════════════════════════════════════╪════════╡
│{"name":"Dr. Denis Abshire","created_at":"2019-10-11 13:54:58","id":"c│true    │
│f5e084f-d963-35d3-9c6f-fe29b86f6d43","updated_at":"2019-10-11 13:54:58│        │
│"}                                                                    │        │
└──────────────────────────────────────────────────────────────────────┴────────┘

Запрос должен быть относительно понятен, но для ясности вот некоторые ожидаемыевыходы -

| Query Folder         | Returned Folder  | Shared? |
|----------------------|------------------|---------|
| Miss Dessie Oritz II | Nick Hamill      | TRUE    |
| Nick Hamill          | Dr Denis Abshire | TRUE    |
| Samara Russell       | Shemar Huels PhD | FALSE   |
| Shemar Huels PhD     | Hazle Ward       | FALSE   |

Я использую neo4j 3.5.11 Community Edition. Я чувствую, что это должно быть довольно простым решением, я просто пересекаю границы моих чрезвычайно ограниченных знаний в области шифров.

Цени любую помощь!

1 Ответ

1 голос
/ 11 октября 2019

Я не понимаю, почему вы используете это в своем запросе:

OPTIONAL MATCH path = (children)<-[*]-(:User)
UNWIND RELATIONSHIPS(path) AS r WITH children, r
WHERE TYPE(r) = 'SHARES'

С (children)<-[*]-(:User) вы ищете весь путь (без ограничения по размеру) между children & User узлов. А с WHERE TYPE(r) = 'SHARES' вам нужны только отношения SHARES ...

Таким образом, ваш запрос будет работать по такой схеме: (children)<-[:CHILD]-(:Folder)<-[:CHILD]-(:Folder)<-[:SHARES]-(:User)

Это то, что вы хотите?

Если это так, вы можете попробовать этот запрос:

MATCH (:Folder { name: 'Nick Hamill' })-[:CHILD]->(children:Folder)
RETURN children AS model, size((children)<-[:CHILD*0..]-(:Folder)<-[:SHARES]-(:User)) > 0 AS shared
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...