Neo4j - 尽管使用合并重复

时间:2014-03-19 23:30:46

标签: php transactions neo4j cypher neo4jphp

我试图通过Neo4JPHP使用MERGE语句生成数据库。我的所有查询都使用MERGE;但是,它每次都会生成单独的节点,导致大量重复。

查询在单个事务中运行。我删除了周围的代码以专注于查询:

$transaction = $client->beginTransaction();

while(...) {
    $pq = new Query($client, 'MERGE (n:Page {url:"'.$page.'"}) SET n.title="'.$title.'"');
    $transaction->addStatements(array($pageQuery));

    $h1Query = new Query($client, 'MATCH (n:Page {url:"'.$page.'"}) SET n.h1s = "['.implode(", ", $h1s).']"');
    $transaction->addStatements(array($h1Query));

    $scriptQuery = new Query($client, 'MATCH (n:Page {url:"'.$page.'"}) MERGE (n)-[:CONTAINS_SCRIPT]->(s:Script {url:"'.$s.'"})');
    $transaction->addStatements(array($scriptQuery));

    $styleQuery = new Query($client, 'MATCH (n:Page {url:"'.$page.'"}) MERGE (n)-[:CONTAINS_STYLESHEET]->(s:StyleSheet {url:"'.$s.'"})');
    $transaction->addStatements(array($styleQuery));

    $otherPageQuery = new Query($client, 'MATCH (n:Page {url:"'.$page.'"}) MERGE (n)-[:LINKS_TO]->(m:Page {url:"'.$match.'"})');
    $transaction->addStatements(array($otherPageQuery));
}

$transaction->commit();

现在,在经过几页后,它会提供相同Page个的6个副本,其中一个包含titleh1s个元素,其余的则没有。CREATE UNIQUE

我也尝试使用{{1}},但这会产生一个错误,即语法不受支持。

我正在运行Neo4j 2.0.1。有什么建议吗?

1 个答案:

答案 0 :(得分:10)

当您在与Cypher中的关系匹配时使用MERGE时,将匹配或创建整个对象。如果找不到匹配项,则会创建整个对象。

例如:

MERGE (n:Page { url: "http://www.neo4j.org" })
RETURN n

获取或创建属性Page设置为url的{​​{1}}。此语句永远不会创建重复的节点。

现在让我们假设这个节点现在存在于Neo4j数据库中,然后我们运行以下查询:

http://www.neo4j.org

这将尝试匹配整个模式,如果它不存在,它将创建整个路径,无论MERGE (n:Page { url: "http://www.neo4j.org" })-[:CONNECTED_TO]->(test:Test { id: "test" }) RETURN * 节点是否存在。

要解决您的问题,请确保先使用Page获取或创建单个节点。然后,您可以使用MERGE来获取或创建两个节点之间的关系。

示例:

MERGE