2015-03-23 2 views
2

Я работаю над проектом с участием Neo4J Db, и у меня возникает проблема, которую я не могу решить самостоятельно.Neo4J: пересечение и предикаты

Мы имеем дело с Acl на графике. Каждый Acl связан с набором метаданных. Элементы также связаны с этими метаданными. Метаданные предоставляют доступ к одному элементу, когда ВСЕ метаданные, связанные с этим элементом, также связаны с метаданными.

Вот фотография модели графа: ACL graph picture

В этом примере ACL1 предоставляет доступ к item1 (но не item2) и acl2 предоставляет доступ к item2 (но не item1).

Я думаю, что хитрость заключается в том, чтобы использовать ВЕСЬ предикат на Линке узлов к одному элементу, но мои попытки всегда возвращаются все элементы из графика (потому что они разделяют одну меты)

Может кто-то помогает мне создать запрос cypher для возврата одному пользователю всех элементов, к которым он может получить доступ?

Спасибо за вашу помощь, Грегори

PS: вот Neo4j консольного примера набор данные: http://console.neo4j.org/r/urjh64

ответ

5

Используя ALL предиката является правильным путь здесь. Как насчет этого вопроса:

MATCH (:User { Login:'User1' })-[:IS_GRANTED]->(acl)-[:IS_APPLICABLE]->(meta)-[:IS_APPLICABLE]->(item) 
WITH item, collect(meta) AS userMetas 
MATCH (item)<-[:IS_APPLICABLE]-(meta2) 
WITH item, userMetas, collect(meta2) AS itemMetas 
WHERE ALL (x IN itemMetas WHERE x IN userMetas) 
RETURN item 

Сначала мы переходим от пользователя ко всем элементам, к которым у него потенциально может быть доступ. Для кандидатов мы возвращаемся и собираем все мета. В WHERE мы гарантируем, что все метаматериалы этого элемента также доступны для пользователя.

+0

Спасибо stefan, он решает мою проблему –

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