【问题标题】:Neo4j - Graphaware reco4php - Problem with namespacesNeo4j - Graphaware reco4php - 命名空间问题
【发布时间】:2018-09-20 16:51:01
【问题描述】:

我正在尝试从 Neo4j 运行演示 - reco4php 页面This Link 我非常仔细地遵循每一步,但最后我得到了一个奇怪的错误。

让我更详细地解释一下:

这是我要运行的代码:

require 'vendor/autoload.php';

use GraphAware\Common\Cypher\Statement;
use GraphAware\Common\Type\Node;
use GraphAware\Reco4PHP\Context\Context;
use GraphAware\Reco4PHP\Engine\SingleDiscoveryEngine;

class RatedByOthers extends SingleDiscoveryEngine
{
public function discoveryQuery(Node $input, Context $context)
{
    $query = 'MATCH (input:User) WHERE id(input) = {id}
    MATCH (input)-[:RATED]->(m)<-[:RATED]-(o)
    WITH distinct o
    MATCH (o)-[:RATED]->(reco)
    RETURN distinct reco LIMIT 500';

    return Statement::create($query, ['id' => $input->identity()]);
}

public function name()
{
    return "rated_by_others";
}
}

上面的代码扩展了“SingleDiscoveryEngine”类:

declare (strict_types = 1);

namespace GraphAware\Reco4PHP\Engine;

use GraphAware\Common\Result\Record;
use GraphAware\Common\Result\ResultCollection;
use GraphAware\Common\Type\Node;
use GraphAware\Reco4PHP\Context\Context;
use GraphAware\Reco4PHP\Result\Recommendations;
use GraphAware\Reco4PHP\Result\SingleScore;

abstract class SingleDiscoveryEngine implements DiscoveryEngine
{
private static $DEFAULT_RECO_NAME = 'reco';
private static $DEFAULT_SCORE_NAME = 'score';
private static $DEFAULT_REASON_NAME = 'reason';


public function buildScore(Node $input, Node $item, Record $record, Context 
$context) : SingleScore
{
    $score = $record->hasValue($this->scoreResultName()) ? $record- >value($this->scoreResultName()) : $this->defaultScore();
    $reason = $record->hasValue($this->reasonResultName()) ? $record- >value($this->reasonResultName()) : null;

    return new SingleScore($score, $reason);
}


final public function produceRecommendations(Node $input, ResultCollection 
$resultCollection, Context $context) : Recommendations
{
    $result = $resultCollection->get($this->name());
    $recommendations = new Recommendations($context);

    foreach ($result->records() as $record) {
        if ($record->hasValue($this->recoResultName())) {
            $recommendations->add($record->get($this->recoResultName()), $this->name(), $this->buildScore($input, $record->get($this->recoResultName()), 
$record, $context));
        }
    }

    return $recommendations;
}

/**
 * {@inheritdoc}
 */
public function recoResultName() : string
{
    return self::$DEFAULT_RECO_NAME;
}

/**
 * {@inheritdoc}
 */
public function scoreResultName() : string
{
    return self::$DEFAULT_SCORE_NAME;
}

/**
 * {@inheritdoc}
 */
public function reasonResultName() : string
{
    return self::$DEFAULT_REASON_NAME;
}

/**
 * {@inheritdoc}
 */
public function defaultScore() : float
{
    return 1.0;
}
}

上面的类也实现了下面的类:

namespace GraphAware\Reco4PHP\Engine;

use GraphAware\Common\Cypher\StatementInterface;
use GraphAware\Common\Result\Record;
use GraphAware\Common\Type\Node;
use GraphAware\Common\Result\ResultCollection;
use GraphAware\Reco4PHP\Context\Context;
use GraphAware\Reco4PHP\Result\Recommendations;
use GraphAware\Reco4PHP\Result\SingleScore;

interface DiscoveryEngine
{
/**
 * @return string The name of the discovery engine
 */
public function name() : string;

/**
 * The statement to be executed for finding items to be recommended.
 *
 * @param Node    $input
 * @param Context $context
 *
 * @return \GraphAware\Common\Cypher\Statement
 */
public function discoveryQuery(Node $input, Context $context) : StatementInterface;

/**
 * Returns the score produced by the recommended item.
 *
 * @param Node    $input
 * @param Node    $item
 * @param Record  $record
 * @param Context $context
 *
 * @return \GraphAware\Reco4PHP\Result\SingleScore A single score produced for the recommended item
 */
public function buildScore(Node $input, Node $item, Record $record, Context $context) : SingleScore;

/**
 * Returns a collection of Recommendation object produced by this discovery engine.
 *
 * @param Node             $input
 * @param ResultCollection $resultCollection
 * @param Context          $context
 *
 * @return Recommendations
 */
public function produceRecommendations(Node $input, ResultCollection $resultCollection, Context $context) : Recommendations;

/**
 * @return string The column identifier of the row result representing the recommended item (node)
 */
public function recoResultName() : string;

/**
 * @return string The column identifier of the row result representing the score to be used, note that this
 *                is not mandatory to have a score in the result. If empty, the score will be the float value returned by
 *                <code>defaultScore()</code> or the score logic if the concrete class override the <code>buildScore</code>
 *                method.
 */
public function scoreResultName() : string;

/**
 * @return float The default score to be given to the discovered recommended item
 */
public function defaultScore() : float;
}

当我运行代码时,出现以下错误:

致命错误:RatedByOthers::name() 的声明必须与 GraphAware\Reco4PHP\Engine\DiscoveryEngine::name() 兼容:第 9 行 /Applications/XAMPP/xamppfiles/htdocs/reco/index.php 中的字符串

我检查了代码几个小时,我认为它应该可以正常工作,但我不知道问题出在哪里。

【问题讨论】:

    标签: php neo4j namespaces


    【解决方案1】:

    我自己找到了答案。

    通过在函数启动后立即声明返回类型解决的问题:

    public function discoveryQuery(Node $input, Context $context) : GraphAware\Common\Cypher\StatementInterface   {
    $query = 'MATCH (input:User) WHERE id(input) = {id}
    MATCH (input)-[:RATED]->(m)<-[:RATED]-(o)
    WITH distinct o
    MATCH (o)-[:RATED]->(reco)
    RETURN distinct reco LIMIT 500';
    
    return Statement::create($query, ['id' => $input->identity()]);
    }
    
    public function name() : string 
    {
    return "rated_by_others";
    }
    

    希望它可以在未来对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 2021-04-03
      • 2013-03-26
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多