1

到目前为止,我一直在使用 PHP Rest Api 来发送带有密码查询的请求并得到响应。响应是一个巨大的字符串,难以解析并且无法转换为 JSON。我现在安装了 Neo4jPHP,并试图弄清楚如何编写与密码相同的查询。这是我的查询:

            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 进行的相同查询将只返回一个节点的名称。为什么会这样?

        $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";
        }
4

2 回答 2

2

在 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个附加提示:

  1. 考虑Person为您的节点分配标签,并使用声明性索引 ( CREATE INDEX ON :Person(name)) 来加快查询开始/结束节点的查找速度
  2. 对于可变路径长度匹配[:KNOWS*],请考虑使用上限,具体取决于图形的大小和结构,这可能会变得相当昂贵。[:KNOWS*10]限制在 10 度。
于 2015-01-15T11:54:29.983 回答
1

经过大量尝试和 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 是非常方便的工具,但不是很流行。小社区和网上很少的例子。希望这可以帮助某人。

于 2015-01-15T14:34:13.983 回答