Neo4j возвращает тип узла в код на стороне клиента

У меня есть модифицированный стек LAMP с использованием Neo4j. Я пытаюсь вернуть тип узла из запроса в моем промежуточном программном обеспечении на мой клиентский Javascript. Я использую библиотеку Graphaware PHP для обработки аутентификации между моим промежуточным программным обеспечением (PHP) и моей базой данных.

Мне просто нужно знать, есть ли что-то в языке запросов Cypher, в котором есть тип узла: функция, которую я могу вставить в предложение RETURN, или что-то, возвращаемое в возвращаемом объекте. Например, если у меня был следующий запрос:

MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"RETURN a,b;

Есть ли что-нибудь, что я могу добавить к запросу Cypher, чтобы я мог различать типы узлов «a» и «b» после того, как они вернулись в мое Middleware? Прямо сейчас я не могу отделить их друг от друга, не сделав в своем промежуточном программном обеспечении грубого массивного оператора switch, имеющего атрибуты, специфичные для каждого типа узла, или разделить запросы для каждого возможного возвращаемого узла (который плохо масштабируется в мой проект).

Neo4j Workbench, похоже, обладает этой функциональностью, поскольку он автоматически делает узлы одного типа одного цвета. Но, глядя на объекты JSON, возвращаемые запросами в рабочей среде, не кажется очевидным, как рабочая среда различает различные типы узлов.

0

Решение

Нет необходимости возвращать дополнительную информацию, поскольку объект Node, возвращаемый клиенту GraphAware php, содержит метки узла.

Вы можете просто отфильтровать запись результата, чтобы добавить дополнительную информацию к ответу, который вы передаете своему веб-интерфейсу.

Пример в PHP:

$result = $this->client->run('MATCH (n:Person)-[:WORKS_AT]->(c) WHERE n.name = {name} RETURN n, c', ['name' => 'Pol']);

$frontendResult = [];

foreach ($result->records() as $record) {
$frontendResult[] = array_map(function(Node $value) {
return [
'properties' => $value->values(),
'type' => $value->labels()[0]
];
}, $record->values());
}

print_r(json_encode($frontendResult, JSON_PRETTY_PRINT));

Который будет производить следующий JSON:

[
[
{
"properties": {
"name": "Pol"},
"type": "Person"},
{
"properties": {
"name": "Acme"},
"type": "Company"}
]
]

labels()[0] предполагается, что вы ожидаете только одну метку на своих узлах, что, конечно, не всегда верно в стандартных приложениях neo4j.

4

Другие решения

Если вы используете Neo4j 3.1 или выше, вы можете использовать картографическую проекцию, чтобы добавить метки, присутствующие на узлах в возвращаемых данных.

MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"RETURN a{.*, labels:labels(a)}, b{.*, labels:labels(b)};

Помните, что метки должны быть коллекцией, так как узлы могут быть с несколькими метками.

РЕДАКТИРОВАТЬ

Если используется версия < 3.1, вы, вероятно, просто должны вернуть метки в виде отдельных столбцов:

MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"RETURN a, labels(a), b, labels(b);
2

По вопросам рекламы [email protected]