我正在调查每个人的neo4j客户端(https://github.com/jadell/neo4jphp/wiki)
使用起来非常有前途和舒适。但是我对索引有点困惑。我知道在Neo4j中你可以添加一个索引:
CREATE INDEX ON :Person(name)
我记得很清楚,这会自动按名称索引所有Person节点。
在everyman客户端库中,索引部分显示您可以创建和添加索引到节点,如下所示:
$shipIndex = new Everyman\Neo4j\Index\NodeIndex($client, 'ships');
(PS:上面这行是做什么的?)
$heartOfGold = $client->makeNode()
->setProperty('propulsion', 'infinite improbability drive')
->save();
// Index the ship on one of its properties
$shipIndex->add($heartOfGold, 'propulsion', $heartOfGold->getProperty('propulsion'));
现在,我的问题。什么时候应该在我的PHP代码中手动添加索引,如上例所示,何时应该将索引添加到我的Neo4j数据库并依赖自动索引? 在后一种情况下,我是否也可以在代码中使用索引搜索:
$match = $shipIndex->findOne('captain', 'Zaphod');
答案 0 :(得分:1)
上述第一种方法将节点及其推进属性添加到lucene索引中。并不是说这种索引现在被标记为遗留。
模式索引现在如下工作:
您在标签/属性组合上创建索引,例如,如果您知道必须通过其登录属性查找用户,则通常建议为快速查找添加索引:
CREATE INDEX ON :User(login);
这种索引,因为neo4j 3.0也可以与CONTAINS
子句一起使用,例如检索登录包含neo
个字母的所有用户:
MATCH (n:User) WHERE n.login CONTAINS 'neo' RETURN n
将使用上面创建的索引进行快速检索。 (nb:截至目前CONTAINS区分大小写)
对于遗留索引和架构索引之间的完全不同的解释,这里有很好的解释:Neo4j auto-index, legacy index and label schema: differences for a relative-to-a-node full-text search
不幸的是,您提到的库不再维护了,正如您在提交历史记录中看到的那样https://github.com/jadell/neo4jphp/commits/master
Neo4j正在发展很多,尤其是3.0版本现在提供了一种新的二进制协议,与http相比,它可以提高性能并减少延迟。
我会建议你(免责声明:我是以下图书馆的作者)使用像https://github.com/graphaware/neo4j-php-client这样的最新客户端。 (请注意,它是纯驱动程序,例如,它不提供ogm功能,您必须编写自己的Cypher查询)