Выяснить разное поведение neo4j и neo4j-драйвера - PullRequest
0 голосов
/ 30 мая 2018

У меня есть элементарная база данных, в которой всего пара узлов и связей.Когда я запускаю команду match (n) return n на локальном веб-клиенте, поставляемом с neo4j, он возвращает все узлы и связи, которые есть в базе данных, как показано на рисунке ниже.

neo4j web client

Однако, когда я запускаю точно такую ​​же команду в проекте node.js с использованием модуля neo4j-driver , он возвращает только три узла, и ни одно из двух отношений не включается.

Немного поигравшись с этим, я заметил, что для извлечения отношений я также должен выпустить что-то вроде match (n)-[r]-(m) return *.Мой первый вопрос: почему такая разница?Не пытается ли локальный веб-клиент сделать что-то еще, чтобы помочь пользователю?

Кроме того, объект возвращаемых записей немного сбивает с толку.Выполнение этой команды match (n)-[r]-(m) return * возвращает 4 элемента в объекте result.records, из которых 2-2 практически идентичны попарно.В упрощенном виде это то, что он возвращает:

item 0: [Jack node, Jill node, Jack -> Jill relationship]
item 1: [Jill node, Jack node, Jack -> Jill relationship]
item 2: [George node, Jill node, George -> Jill relationship]
item 3: [Jill node, George node, George -> Jill relationship]

Таким образом, элементы 0 и 1 объекта result.records отличаются только порядком их элементов.То же самое для пунктов 2 и 3.

Вопрос второй: что мне делать с этим, если я хочу отобразить график на веб-странице?Ищите уникальные идентификаторы узлов и отношений во всех различных возвращаемых комбинациях?

Вопрос третий: может быть, есть лучший способ достичь того, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 30 мая 2018

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

Этот запрос может вам помочь:

match p=(n)-[r]-(m) return p

Но да, вы правы,вам придется распаковать результат в вашем заявлении, чтобы иметь возможность сделать свою собственную интерпретацию.Это тот случай, когда вы получаете то, о чем просили , с которой сталкиваются довольно многие пользователи Neo4j.Это связано с тем, что Cypher может возвращать довольно много разных вещей (табличные результаты, узлы, узлы и отношения, пути, подграфы, ...), и драйвер должен обеспечивать их все.

Взгляните на вкладку code в браузере, чтобы понять, с чем будет работать ваше приложение (что вы на самом деле получите, зависит от выбранного вами языка приложения).Это не очень сложно, но требует некоторого привыкания.

Надеюсь, это поможет.

С уважением, Том

PS Ожидается удвоение результатов притакие общие запросы.Neo4j выполняет сопоставление с шаблоном, и ваш шаблон не имеет направления на отношения, а также не имеет меток или типов отношений.Это вернет довольно много совпадений, где, например, (jill) - [: nominated] - (jack), но, очевидно, это также соответствует (jack) - [: nominated] - (jill).Оба соответствуют шаблону.Использование DISTINCT может немного помочь, но вы действительно должны быть более явными в шаблоне.

...