Я новичок в neo4j и в настоящее время использую библиотеку Neo4jphp с cypher для хранения и извлечения узлов. Моя логика довольно проста. Я хочу получить узел (сообщение) и получить все его лайки (количество лайков) и все комментарии (узлы) с их комментаторами (узлами пользователя метки) и иметь возможность анализировать ResultSet в массиве php, чтобы затем кодировать его в Json.
Выражение cypher, которое я использую:
MATCH (user:User)-[:POSTED]->(post) WHERE post.UserID = '13' AND id(post)=106 OPTIONAL MATCH ()- [rel:LIKES]-(post) OPTIONAL MATCH (post)-[:HAS]-(comment:Comment)<-[:COMMENTED]-(commenter:User) RETURN user, post,count(rel) AS Likes, rel, comment, commenter
Соответствие извлекает все узлы правильно (хотя этот пост не имеет лайков):
Neo4j http://bookintransit.com/kkk.PNG
Как получить правильное представление этого графика с помощью библиотеки?
Также обратите внимание, что для простоты я получил один почтовый узел (id: 106) в этом примере. Но я хотел бы получить список сообщений, когда я использую код в своем приложении.
Это PHP-код, который я использую:
$queryString = "MATCH (user:User)-[:POSTED]->(post) WHERE post.UserID = {qUser} OPTIONAL MATCH ()-[rel:LIKES]-(post) OPTIONAL MATCH (post)-[:HAS]-(comment:Comment)<-[:COMMENTED]-(commenter:User) RETURN user, post,count(rel) AS Likes, rel, comment, commenter ORDER BY post.TS DESC LIMIT ".$NumberOfPosts;
$query = new Everyman\Neo4j\Cypher\Query($client, $queryString, array('qUser' => $UserID));
$result = $query->getResultSet();
if(count($result)>0){
foreach($result AS $row){
// How do I get the correct graph in a php array to parse to json
}
Я думаю, что вы ищете что-то подобное. Найти все сообщения пользователя. С каждым постом по желанию можно найти все комментарии и понравиться каждому; поместить комментарии и связанных пользователей в коллекцию; посчитать количество лайков; и вернуть все по почте.
match (u:User {name: "13})-[:POSTED]-(p:Post)
with p
optional match (p)-[:HAS]-(c:Comment)-(u:User)
optional match (p)-[:HAS]-(l:Like)
with p
, [c, u] as comment
, count(l) as likes
return p, collect(comment), likes
С neo4jphp я понятия не имею, возможно ли это. Кстати, это возможно с neoclient :
NeoClient использует средство форматирования ответа, обрабатывающее содержимое данных результата графика, поэтому вы получаете в результате объект, как выглядит ваш график на изображении, которое вы разместили:
$result = $client->sendCypherQuery($yourQuery, $parameters);
$posts = $result->getNodes('Post');
$post = $result->getSingleNode('Post');
$comments = $post->getInboundRelationships('HAS');
foreach ($comments->getEndNode() as $comment) {
echo $comment->getProperty('text');
$user = $comment->getSingleRelationship('COMMENTED')->getEndNode();
echo $user->getProperty('username');
}
Как видите, набор результатов — это просто графическое представление вашего ответа, вам просто нужно пройтись по нему.