在 Symfony 中使用原始 Cypher 查询 Neo4j
Using raw Cypher to query Neo4j in Symfony
我正在尝试完成本教程:http://www.sitepoint.com/adding-social-network-features-php-app-neo4j/ 但是使用 Symfony 框架而不是 Silex。
我已经能够使用 Symfony 将 Neo4j 设置为 运行,并且能够将用户数据添加到图表中。现在我想在列表中显示所有用户电子邮件地址。我已经采取了这个脚本:
public function home(Application $application, Request $request)
{
$neo = $application['neo'];
$q = 'MATCH (user:User) RETURN user';
$result = $neo->sendCypherQuery($q)->getResult();
$users = $result->get('user');
return $application['twig']->render('index.html.twig', array(
'users' => $users
));
}
并将其改编为:
public function showUsersAction()
{
$em = $this->container->get('neo4j.manager');
$query = 'MATCH (n:`User`) RETURN n';
$users = $em->cypherQuery($query);
//print_r($users);
return $this->render('UserBundle:Account:showUsers.html.twig', array('users' =>$users));
}
而树枝看起来如下:
{% extends '::base.html.twig' %}
{% block content %}
<h1>get all users:</h1>
<ul>
{% for user in users %}
<li>{{ user.property('email') }}</li>
{% endfor %}
</ul>
{% endblock %}
但是树枝中的某些东西是错误的,我得到了错误:
Method "property" for object "Everyman\Neo4j\Query\Row" does not exist in UserBundle:Account:showUsers.html.twig at line 6
在 twig 文件的语法中发现了问题。查阅此页面后:https://github.com/jadell/neo4jphp/wiki/Cypher-and-gremlin-queries 很明显,我必须在我的树枝模板中包含 user['n']
。树枝模板现在看起来是这样的:
{% extends '::base.html.twig' %}
{% block content %}
<h1>get all users:</h1>
<ul>
{% for user in users %}
<li>{{ user['n'].getProperty('email') }}</li>
{% endfor %}
</ul>
{% endblock %}
我是你提到的那篇文章的作者。问题是您使用的 neo4j 库与文章中使用的库不同,因此 neoclient,因此文章中使用的方法与 neo4jphp 提供的方法不同。
由于 NeoClient 大量使用了 Symfony 组件,因此将其集成到 Symfony 中非常容易,您只需覆盖 DI 即可。这里的例子:https://github.com/graphaware/GithubNeo4j/tree/master/src/GraphAware/Neo4jBundle
然后您就可以使用我在 Sitepoint 上写的 3 篇文章中介绍的方法。
所以你这个twig模板的问题是他没有找到node对象class的getProperty
方法,这和neo4jphp一样正常returnsRow对象classes.
如果像文章中那样切换回 neoclient,您可以在 Twig 模板中编写:
{% for user in users %}
<li>{{ user.getProperty('email') }}</li>
{% endfor %}
我正在尝试完成本教程:http://www.sitepoint.com/adding-social-network-features-php-app-neo4j/ 但是使用 Symfony 框架而不是 Silex。
我已经能够使用 Symfony 将 Neo4j 设置为 运行,并且能够将用户数据添加到图表中。现在我想在列表中显示所有用户电子邮件地址。我已经采取了这个脚本:
public function home(Application $application, Request $request)
{
$neo = $application['neo'];
$q = 'MATCH (user:User) RETURN user';
$result = $neo->sendCypherQuery($q)->getResult();
$users = $result->get('user');
return $application['twig']->render('index.html.twig', array(
'users' => $users
));
}
并将其改编为:
public function showUsersAction()
{
$em = $this->container->get('neo4j.manager');
$query = 'MATCH (n:`User`) RETURN n';
$users = $em->cypherQuery($query);
//print_r($users);
return $this->render('UserBundle:Account:showUsers.html.twig', array('users' =>$users));
}
而树枝看起来如下:
{% extends '::base.html.twig' %}
{% block content %}
<h1>get all users:</h1>
<ul>
{% for user in users %}
<li>{{ user.property('email') }}</li>
{% endfor %}
</ul>
{% endblock %}
但是树枝中的某些东西是错误的,我得到了错误:
Method "property" for object "Everyman\Neo4j\Query\Row" does not exist in UserBundle:Account:showUsers.html.twig at line 6
在 twig 文件的语法中发现了问题。查阅此页面后:https://github.com/jadell/neo4jphp/wiki/Cypher-and-gremlin-queries 很明显,我必须在我的树枝模板中包含 user['n']
。树枝模板现在看起来是这样的:
{% extends '::base.html.twig' %}
{% block content %}
<h1>get all users:</h1>
<ul>
{% for user in users %}
<li>{{ user['n'].getProperty('email') }}</li>
{% endfor %}
</ul>
{% endblock %}
我是你提到的那篇文章的作者。问题是您使用的 neo4j 库与文章中使用的库不同,因此 neoclient,因此文章中使用的方法与 neo4jphp 提供的方法不同。
由于 NeoClient 大量使用了 Symfony 组件,因此将其集成到 Symfony 中非常容易,您只需覆盖 DI 即可。这里的例子:https://github.com/graphaware/GithubNeo4j/tree/master/src/GraphAware/Neo4jBundle
然后您就可以使用我在 Sitepoint 上写的 3 篇文章中介绍的方法。
所以你这个twig模板的问题是他没有找到node对象class的getProperty
方法,这和neo4jphp一样正常returnsRow对象classes.
如果像文章中那样切换回 neoclient,您可以在 Twig 模板中编写:
{% for user in users %}
<li>{{ user.getProperty('email') }}</li>
{% endfor %}