У меня есть модифицированный стек 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, возвращаемые запросами в рабочей среде, не кажется очевидным, как рабочая среда различает различные типы узлов.
Нет необходимости возвращать дополнительную информацию, поскольку объект 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.
Если вы используете 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);