До сих пор я использовал PHP Rest Api для отправки запросов с зашифрованными запросами и получения ответа обратно. Ответ представляет собой огромную строку, которая затрудняет анализ и не может быть преобразована в JSON.
Теперь я установил Neo4jPHP и пытаюсь выяснить, как написать тот же запрос, что и у меня в cypher.
Это мой запрос:
MATCH (n:RealNode)-[r:contains*]-(z) WHERE n.gid='123' RETURN n,z;")
На самом деле я хочу получить список всех имен узлов (name — это свойство внутри каждого узла), который связан с моим n узлом. Как мне это сделать?
Я не могу найти много примеров для Neo4jPHP онлайн, и те, которые я нашел, похоже, не работают. Я скачал последнюю версию отсюда (https://github.com/jadell/neo4jphp).
Спасибо
D.
RE-EDITED
Я пытаюсь этот запрос в neo4j Server:
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";
}
На уровне 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)
) чтобы ускорить поиск начального / конечного узла вашего запроса[:KNOWS*]
рассмотрите возможность использования верхнего предела, в зависимости от размера и структуры вашего графика это может быть довольно дорого. [:KNOWS*10]
ограничить на 10 градус.После долгих попыток и некоторой помощи от Стефана Армбрустера я заставил его работать, используя 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 — очень удобный инструмент, но не очень популярный. Небольшое сообщество и несколько примеров в Интернете. Надеюсь, это кому-нибудь поможет.