ran*_*dak 4 php transactions neo4j cypher neo4jphp
我试图MERGE通过Neo4JPHP 使用语句生成数据库.我的所有查询都在使用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();
Run Code Online (Sandbox Code Playgroud)
现在,在几页之后运行它,它会产生6个相同的Pages 副本,一个带有title和h1s元素,其余没有.
我也尝试过使用CREATE UNIQUE,但这给出了一个错误,即语法不受支持.
我正在运行Neo4j 2.0.1.有什么建议?
Ken*_*ani 10
当您使用MERGE与Cypher中的关系匹配时,将匹配或创建整个对象.如果找不到匹配项,则会创建整个对象.
例如:
MERGE (n:Page { url: "http://www.neo4j.org" })
RETURN n
Run Code Online (Sandbox Code Playgroud)
获取或创建Page属性url设置为http://www.neo4j.org.此语句永远不会创建重复节点.
现在让我们假设这个节点现在存在于Neo4j数据库中,然后我们运行以下查询:
MERGE (n:Page { url: "http://www.neo4j.org" })-[:CONNECTED_TO]->(test:Test { id: "test" })
RETURN *
Run Code Online (Sandbox Code Playgroud)
这将尝试匹配整个模式,如果它不存在,它将创建整个路径,无论该Page节点是否存在.
要解决您的问题,请确保首先使用MERGE或创建单个节点.然后,您可以MERGE用来获取或创建两个节点之间的关系.
例:
MERGE (n:Page { url: "http://www.neo4j.org" })
MERGE (s:StyleSheet { url: "http://www.neo4j.org/styles/main.css" })
MERGE (n)-[:CONTAINS_STYLESHEET]->(s)
RETURN *
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
803 次 |
| 最近记录: |