我使用Neo4j修改了LAMP堆栈。我试图将节点类型从我的中间件中的查询返回到我的客户端Javascript。我正在使用Graphaware PHP库来处理我的中间件(PHP)和我的数据库之间的身份验证。
我只需要知道Cypher查询语言中是否存在具有节点类型的东西:我可以放入RETURN子句中的函数,或返回对象中返回的函数。例如,如果我有以下查询:
MATCH (a:Person)--(b:Institution)
WHERE a.name CONTAINS "David"
RETURN a,b;
有什么我可以添加到Cypher查询中,所以我可以在它们返回到我的中间件后区分节点类型“a”和“b”吗?现在,我没有在我的中间件中制作具有特定于每个节点类型的属性的大量切换语句来区分它们,或者为每个可能返回的节点编写单独的查询(这在我的项目)。
Neo4j Workbench似乎具有此功能,因为它会自动使相同类型的节点具有相同的颜色。但是通过查看工作台中查询返回的JSON对象,工作台如何区分不同的节点类型似乎并不明显。
答案 0 :(得分:4)
由于返回到GraphAware php客户端的Node对象包含节点标签,因此无需返回额外信息。
您只需过滤结果记录,即可将附加信息添加到传递给前端的回复中。
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应用程序中并不总是如此。
答案 1 :(得分:2)
如果您使用的是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);