Neo4j Return 节点类型到客户端代码
Neo4j Return Node Type to Client-Side Code
我使用 Neo4j 修改了 LAMP 堆栈。我正在尝试 return 从我的中间件中的查询到我的客户端的节点类型 Javascript。我正在使用 Graphaware PHP 库来处理我的中间件 (PHP) 和我的数据库之间的身份验证。
我只需要知道 Cypher 查询语言中是否有包含节点类型的内容:我可以放入 RETURN 子句中的函数,或者 returned 中的内容return 对象。例如,如果我有以下查询:
MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"
RETURN a,b;
有什么我可以添加到 Cypher 查询中的,这样我就可以在节点类型 "a" 和 "b" return 加入我的中间件后区分它们吗?现在我无法区分它们,除非在我的中间件中做一个巨大的大量 switch 语句,该语句具有特定于每个节点类型的属性来区分它们,或者为每个可能的节点编写单独的查询 return (这确实在我的项目中不能很好地扩展。
Neo4j Workbench 似乎具有此功能,因为它会自动使相同类型的节点具有相同的颜色。但是通过查看 JSON 对象 return 从 workbench 中的查询编辑的 workbench 似乎并不明显 workbench 如何区分不同的节点类型。
如果您使用的是 Neo4j 3.1 或更高版本,则可以使用地图投影来添加 returned 数据中节点上的标签。
MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"
RETURN a{.*, labels:labels(a)}, b{.*, labels:labels(b)};
请记住,标签应该是一个集合,因为节点可以是 multi-labeled。
编辑
如果使用版本 < 3.1,您可能只需要 return 标签作为单独的列:
MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"
RETURN a, labels(a), b, labels(b);
不需要 return 额外的信息,因为 return 发送到 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 修改了 LAMP 堆栈。我正在尝试 return 从我的中间件中的查询到我的客户端的节点类型 Javascript。我正在使用 Graphaware PHP 库来处理我的中间件 (PHP) 和我的数据库之间的身份验证。
我只需要知道 Cypher 查询语言中是否有包含节点类型的内容:我可以放入 RETURN 子句中的函数,或者 returned 中的内容return 对象。例如,如果我有以下查询:
MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"
RETURN a,b;
有什么我可以添加到 Cypher 查询中的,这样我就可以在节点类型 "a" 和 "b" return 加入我的中间件后区分它们吗?现在我无法区分它们,除非在我的中间件中做一个巨大的大量 switch 语句,该语句具有特定于每个节点类型的属性来区分它们,或者为每个可能的节点编写单独的查询 return (这确实在我的项目中不能很好地扩展。
Neo4j Workbench 似乎具有此功能,因为它会自动使相同类型的节点具有相同的颜色。但是通过查看 JSON 对象 return 从 workbench 中的查询编辑的 workbench 似乎并不明显 workbench 如何区分不同的节点类型。
如果您使用的是 Neo4j 3.1 或更高版本,则可以使用地图投影来添加 returned 数据中节点上的标签。
MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"
RETURN a{.*, labels:labels(a)}, b{.*, labels:labels(b)};
请记住,标签应该是一个集合,因为节点可以是 multi-labeled。
编辑
如果使用版本 < 3.1,您可能只需要 return 标签作为单独的列:
MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"
RETURN a, labels(a), b, labels(b);
不需要 return 额外的信息,因为 return 发送到 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 应用程序中当然并不总是正确的。