2014-10-27 6 views
0

Я использую Neo4j для реализации социальной сети. Модель временной шкалы пользователя выглядит следующим образом.Cypher различные действия, основанные на типе узлов

Пользователь может иметь два действия: Публиковать и делиться, каждый из них создается как узел с соответствующими метками. Все узлы активности соединены через край с типом NEXT один за другим, упорядоченным по времени создания. Модель, как:

(:User)-[:TIMELINE]->(:Publish)-[:NEXT]->(:Share)-[:NEXT]->(:Share)->[:NEXT]->(:Publish)->... 

Теперь проблема, когда я хочу, чтобы принести узлы, я не знаю, как выполнять запросы в соответствии с этикеткой узлов.

Например, когда узел является Publish, я должен что-то сделать; и когда узел является Share, я должен сделать некоторые другие совершенно разные вещи.

Есть ли способ достичь этого?

ответ

1

Cypher имеет функцию labels, возвращающую массив, содержащую метки этого узла:

MATCH (:User {userID:'123'})-[:TIMELINE]->()-[:NEXT*0..100]->(activity) 
RETURN "Publish" in labels(activity) as isPublish, "Share" in labels(activity) as isShare 

В случае, если вы хотите сделать мутирует операцию условно, увидеть мой ответ https://stackoverflow.com/a/26567379/158701.

+0

Я хочу, чтобы возвращать различные данные в различных случаях, например, return node.name, когда это узел Publish, и node.author, когда он является узлом Share. Является ли это возможным? – HanXu

0

Используйте либо:

return coalesce(node.name, node.author) 

или

return case when node:Publish then node.name when node:Share node.author else "unknown" end 
Смежные вопросы