#neo4j #cypher #neo4j-apoc
#neo4j #cypher #neo4j-apoc
Вопрос:
У меня проблема с моим запросом cypher.
Объясненная ситуация: пользователь может подключаться к другим контактным узлам, но он также может подключаться к узлам СОБЫТИЙ. Другие пользователи также могут подключаться к этим узлам событий. Мы ожидаем получить узлы, к которым мы подключены (КОНТАКТ и СОБЫТИЕ), но нам также нужно получить узлы событий узлов КОНТАКТОВ, к которым мы подключены.
Это график, который мы хотим видеть, когда извлекаем подключенные узлы из нижнего центрального контактного узла:
Но мы получаем этот вывод в формате json:
{
"_type": "Node",
"_id": 1,
"nodeType": "EVENT",
"nodeId": 1,
"connected_with": [
{
"_type": "Node",
"_id": 0,
"nodeType": "CONTACT",
"nodeId": 1
},
{
"_type": "Node",
"_id": 2,
"nodeType": "CONTACT",
"nodeId": 2,
"connected_with": [
{
"_type": "Node",
"_id": 0,
"nodeType": "CONTACT",
"nodeId": 1
}
]
}
]
}
Мы хотим углубиться на 2 уровня, то есть мы хотим видеть
контакты, к которым мы подключены, но также и контакты, к которым мы
«встретились» на мероприятии, отсюда и причина, по которой мы хотим углубиться на 2 уровня.
В настоящее время мы выполняем этот запрос cypher, но, как упоминалось ранее, он не работает.
MATCH path = (n:Node {nodeId: 1})<-[:CONNECTED_WITH*]-(nodes)
WITH collect(path) as paths
CALL apoc.convert.toTree(paths) yield value as json
RETURN json
Будем признательны за любую помощь!
Ответ №1:
Ваши результаты, похоже, соответствуют тому, что вы говорите, что хотите, за исключением того, что они представлены в виде дерева (которое вы просили).
Вы заявляете, что «видите» не то, что ожидали (предположительно, в браузере neo4j). Это потому, что запрошенные вами результаты не являются простыми узлами, связями и / или путями.
Попробуйте это вместо этого (обратите также внимание на верхнюю границу 2
глубины шаблона пути переменной длины):
MATCH path = (n:Node {nodeId: 1})<-[:CONNECTED_WITH*..2]-(nodes)
RETURN path
В стороне: наличие только одной метки узла, Node
со nodeType
свойством, которое указывает точный «тип» узла, обычно не является правильным способом моделирования вещей. Это затрудняет понимание базы данных, имеет тенденцию усложнять ваш код и затрудняет использование преимуществ индексации. Вероятно, вы хотите иметь отдельные метки (скажем, Person
и Event
). Вы также можете захотеть иметь разные типы отношений.
Комментарии:
1. Да, результат в браузере neo4j правильный, однако вывод в формате json — нет. Вывод json должен начинаться с узла, содержащего идентификатор, который был указан в запросе. Тогда он должен иметь узлы connected_with, и они также должны содержать события, к которым они подключены. Я должен был использовать две разные сущности узла, чтобы упростить задачу, как вы сказали! Спасибо за совет!