Neo4j: запрос Cypher возвращает неправильный результат json

У меня проблема с моим шифровальным запросом.

Объяснение ситуации: пользователь может подключаться к другим узлам CONTACT, но он также может подключаться к узлам СОБЫТИЯ. Другие пользователи также могут подключаться к этим узлам событий. Мы ожидаем получить узлы, к которым мы подключены (КОНТАКТЫ И СОБЫТИЯ), но нам также необходимо получить узлы событий узлов КОНТАКТ, к которым мы подключены.

Это график, который мы хотим видеть, когда извлекаем подключенные узлы из нижнего центрального узла CONTACT:

neo4j graph

Но мы получаем такой вывод 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 уровня.

В настоящее время у нас выполняется этот шифровальный запрос, но, как упоминалось ранее, он не работает.

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

Любая помощь будет оценена по достоинству!


person Sige VV    schedule 15.03.2019    source источник


Ответы (1)


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

Вы заявляете, что не «видите» то, что ожидали (предположительно, в браузере neo4j). Это связано с тем, что запрошенные вами результаты не являются простыми узлами, отношениями и / или путями.

Попробуйте вместо этого (обратите внимание также на верхнюю границу 2 глубины шаблона пути переменной длины):

MATCH path = (n:Node {nodeId: 1})<-[:CONNECTED_WITH*..2]-(nodes)
RETURN path

В сторону: наличие только одной метки узла, Node, со свойством nodeType, которое определяет точный «тип» узла, обычно не является правильным способом моделирования вещей. Это затрудняет понимание БД, имеет тенденцию усложнять ваш код и затрудняет использование индексации. Вероятно, вы захотите иметь отдельные ярлыки (скажем, Person и Event). Вы также можете захотеть иметь разные типы отношений.

person cybersam    schedule 15.03.2019
comment
Да, результат в браузере neo4j правильный, но вывод json - нет. Выходные данные json должны начинаться с узла, содержащего идентификатор, указанный в запросе. Тогда у него должны быть узлы connected_with, и они также должны содержать события, к которым они подключены. Я должен был использовать две разные сущности узла, чтобы упростить задачу, как вы сказали! Спасибо за совет! - person Sige VV; 16.03.2019