如何使用neo4jPHP获取两个节点之间的所有节点名称
How to get all node names between two nodes using neo4jPHP
到目前为止,我一直在使用 PHP Rest Api 来发送带有密码查询的请求并获得响应。响应是一个巨大的字符串,难以解析,无法转换为 JSON。
我现在安装了 Neo4jPHP 并且我正在尝试弄清楚如何编写我在 cypher 中使用的相同查询。
这是我的查询:
MATCH (n:RealNode)-[r:contains*]-(z) WHERE n.gid='123' RETURN n,z;")
我真正想要的是获取与我的n节点相关的所有节点名称的列表(名称是每个节点内的属性)。我该怎么做?
我在网上找不到很多关于 Neo4jPHP 的示例,而且我找到的那些似乎不起作用。我从这里下载了最新版本 (https://github.com/jadell/neo4jphp)。
谢谢
D.
重新编辑
我在 neo4j 服务器中尝试这个查询:
MATCH (n)-[r:KNOWS*]-(z) WHERE n.name='Arthur Dent' AND z.name='Ford Prefect' RETURN n,z,r;
我得到了所有 3 个相互连接的节点。通过 neo4jPHP 的相同查询将 return 只有一个节点的名称。为什么会这样?
$querystring="MATCH path=(n:RealNode {gid:'58731'})-[:contains*]-(z) RETURN [x in nodes(path) | x.id] as names";
$query=new Everyman\Neo4j\Cypher\Query($client,$querystring);
$result=$query->getResultSet();
print_r($result);
foreach($result as $row){
echo $row['x']->getProperty('name') . "\n";
}
在 Cypher 级别,您可以使用如下查询:
MATCH path=(n {name:'Arthur Dent'])-[:KNOWS*]-(z {name:'Ford Perfect'})
RETURN [x in nodes(path) | x.name] as names
您在此处 path
将变量分配给模式。在 RETURN
中,您遍历该路径上的所有节点并提取其 name
属性.
2 条额外提示:
- 考虑分配标签,例如
Person
到您的节点并使用声明性索引 ( CREATE INDEX ON :Person(name)
) 来加快查找 start/end 您的查询节点
- 对于可变路径长度匹配
[:KNOWS*]
考虑使用上限,这取决于图形的大小和结构,这可能会变得相当昂贵。 [:KNOWS*10]
限制在 10 度。
经过大量尝试和 Stefan Armbruster 的一些帮助后,我使用 Neo4jPHP 使其工作。
它是这样的:
$client = new Everyman\Neo4j\Client();
$querystring="MATCH path=(n {gid:'58731'})-[:contains*]-(z) RETURN LAST([x in nodes(path) | x.id]) as names";
$query=new Everyman\Neo4j\Cypher\Query($client,$querystring);
$result=$query->getResultSet();
foreach($result as $resultItem){
$resultArray[] = $resultItem['n'];
}
print_r($resultArray); // prints the array
Neo4jPHP 是非常方便的工具,但不是很流行。小型社区和在线示例很少。希望这对某人有所帮助。
到目前为止,我一直在使用 PHP Rest Api 来发送带有密码查询的请求并获得响应。响应是一个巨大的字符串,难以解析,无法转换为 JSON。 我现在安装了 Neo4jPHP 并且我正在尝试弄清楚如何编写我在 cypher 中使用的相同查询。 这是我的查询:
MATCH (n:RealNode)-[r:contains*]-(z) WHERE n.gid='123' RETURN n,z;")
我真正想要的是获取与我的n节点相关的所有节点名称的列表(名称是每个节点内的属性)。我该怎么做?
我在网上找不到很多关于 Neo4jPHP 的示例,而且我找到的那些似乎不起作用。我从这里下载了最新版本 (https://github.com/jadell/neo4jphp)。
谢谢 D.
重新编辑
我在 neo4j 服务器中尝试这个查询:
MATCH (n)-[r:KNOWS*]-(z) WHERE n.name='Arthur Dent' AND z.name='Ford Prefect' RETURN n,z,r;
我得到了所有 3 个相互连接的节点。通过 neo4jPHP 的相同查询将 return 只有一个节点的名称。为什么会这样?
$querystring="MATCH path=(n:RealNode {gid:'58731'})-[:contains*]-(z) RETURN [x in nodes(path) | x.id] as names";
$query=new Everyman\Neo4j\Cypher\Query($client,$querystring);
$result=$query->getResultSet();
print_r($result);
foreach($result as $row){
echo $row['x']->getProperty('name') . "\n";
}
在 Cypher 级别,您可以使用如下查询:
MATCH path=(n {name:'Arthur Dent'])-[:KNOWS*]-(z {name:'Ford Perfect'})
RETURN [x in nodes(path) | x.name] as names
您在此处 path
将变量分配给模式。在 RETURN
中,您遍历该路径上的所有节点并提取其 name
属性.
2 条额外提示:
- 考虑分配标签,例如
Person
到您的节点并使用声明性索引 (CREATE INDEX ON :Person(name)
) 来加快查找 start/end 您的查询节点 - 对于可变路径长度匹配
[:KNOWS*]
考虑使用上限,这取决于图形的大小和结构,这可能会变得相当昂贵。[:KNOWS*10]
限制在 10 度。
经过大量尝试和 Stefan Armbruster 的一些帮助后,我使用 Neo4jPHP 使其工作。 它是这样的:
$client = new Everyman\Neo4j\Client();
$querystring="MATCH path=(n {gid:'58731'})-[:contains*]-(z) RETURN LAST([x in nodes(path) | x.id]) as names";
$query=new Everyman\Neo4j\Cypher\Query($client,$querystring);
$result=$query->getResultSet();
foreach($result as $resultItem){
$resultArray[] = $resultItem['n'];
}
print_r($resultArray); // prints the array
Neo4jPHP 是非常方便的工具,但不是很流行。小型社区和在线示例很少。希望这对某人有所帮助。