Выяснить разное поведение neo4j и neo4j-драйвера

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

веб-клиент neo4j

Однако когда я запускаю точно такую ​​же команду в проекте 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 ответ

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам