使用Neo4php在Neo4j中创建关系时间过长

时间:2014-10-11 08:38:44

标签: neo4j graph-databases neo4jphp

我一直在尝试使用neo4jphp [https://github.com/jadell/neo4jphp/wiki]为我们的新模块创建节点和关系。

我正在使用cypher查询。

使用以下查询创建节点:

$queryNodes = "CREATE (n:User { props } ) ";
$query      = new Everyman\Neo4j\Cypher\Query($client, $queryNodes, array('props' => $arrNodeProperties));
$result     = $query->getResultSet();

使用以下查询创建关系:

$queryRelations = "
   MATCH (authUser: User { userid: 0001 }),(friend)
     WHERE friend.userid IN ['" . implode("','",$relations) . "']
        CREATE UNIQUE (authUser)-[r:KNOWS { connection: 'user_friend' }]->(friend)";

到目前为止,节点创建工作正在进行中。

但是当我尝试为节点创建唯一关系时,它需要太长时间......

注意: 标签User有唯一的约束userid,因此标签user的节点由属性userid上的Neo4j索引。

CREATE CONSTRAINT ON (user:User) ASSERT user.userid IS UNIQUE

问题:

  1. 我们是否还有其他方式可以创造独特的关系。
  2. 我可以在关系上使用索引吗?如果是,我怎样才能达到同样的目的。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用MERGE代替CREATE UNIQUE。另外,在客户端使用Cypher参数作为fried列表而不是串联,请参阅http://docs.neo4j.org/chunked/stable/cypher-parameters.html

答案 1 :(得分:0)

最后,我做了很多改变......

感谢@MichaelHunger的帮助。

所以我就是这样做的......

使用MERGE,FOREACH,ON CREATE SET和params创建唯一节点:

$queryNodes = "
    FOREACH (nodeData IN {nodeProperties}|
        MERGE (n:User { userid: nodeData.userid })
            ON CREATE SET
                n.login = nodeData.login,
                n.userid = nodeData.userid,
                n.username = nodeData.username,
                n.name = nodeData.name,
                n.gender = nodeData.gender,
                n.profile_pic = nodeData.profile_pic,
                n.create_date = timestamp()
            ON MATCH SET
                n.update_date = timestamp()
    )
";
$query = new Everyman\Neo4j\Cypher\Query($client, $queryNodes, array('nodeProperties' => $arrNodeProperties));
$result = $query->getResultSet();

使用以下查询创建唯一关系:

$queryRelations = "
    MATCH (authUser: User { userid: {authUserid} }), (friend:User)
        WHERE friend.userid IN {friendUserIds}
    CREATE UNIQUE (authUser)-[r:KNOWS { connection: 'user_friend' }]->(friend)
";
$query  = new Everyman\Neo4j\Cypher\Query($client, $queryRelations, array('friendUserIds' => $arrFriendUserId, 'authUserid' => $authUserid));
$result = $query->getResultSet();

如果我们可以进一步改善,请发表评论。