8

私はこれについてすべて間違っていると感じています。とにかく。

私は、このタスクを簡単にするために構築した、本質的に意図的に非正規化されたテーブルを持つSQLデータベースを持っているので、1つのテーブルからデータを取得するだけです。

私が持っているのは、次のようなペアのテーブルです。

user_lo | user_hi | something_else | other stuff
1000    | 1234    | 1231251654     | 123
1050    | 1100    | 1564654        | 45648
1080    | 1234    | 456444894648   | 1

等々。

したがって、neo4jグラフデータベースでは、各ユーザーIDをノードとして使用する必要があります。他のものはそれほど重要ではありませんが、基本的にはリレーションの要素になります。

ユーザーごとに1つのノードだけが必要なので、次のようなことをすると、次のように感じます。

while (rs.next()) {
    node_lo = db.createNode();
    node_lo.setProperty("user_id", rs.getInt(1));
    node_hi = db.createNode();
    node_hi.setProperty("user_id", rs.getInt(2));
}

user_id 1234のノードを2回追加すると、新しいノードが作成されるだけですが、必要なのは、ノードを作成するのではなく、このノードを取得して、1080の関係に追加できるようにすることです。この場合。

では、これを行う方法は何ですか?

4

6 に答える 6

4

CREATE UNIQUEを見たことがありますか?

Cypherを使用できない場合は、一意のノードを使用できますか?

于 2012-06-12T15:40:05.900 に答える
4

インデックスを使用して検索し、結果が見つからない場合は、新しいインデックスを作成します。

Index<Node> userIndex = graphDatabaseService.index().forNodes('UserNodes');

IndexHits<Node> userNodes = userIndex.get('id', 1234);

if(!userNodes.hasNext()){
    //Create new User node
} else {
    Node userNode = userNodes.next();
}

これはあなたが探しているタイプの操作ですか?

于 2012-06-13T02:44:48.810 に答える
2

Neo4jが提供するUniqueNodeFactoryを使用することをお勧めします。

    public Node getOrCreateUserWithUniqueFactory( String username, GraphDatabaseService graphDb )
{
    UniqueFactory<Node> factory = new UniqueFactory.UniqueNodeFactory( graphDb, "UserNodes" )
    {
        @Override
        protected void initialize( Node created, Map<String, Object> properties )
        {
            created.setProperty( "id", properties.get( "id" ) );
        }
    };

    return factory.getOrCreate( "id", id );
}
于 2012-06-13T22:24:18.957 に答える
1

SQLテーブルを正規化して、ノードとリレーションシップのように見せます。次に、移行に暗号を使用すると、次のような方法で移行を再実行可能にすることができます。

start a = node:node_auto_index('id:"<PK_Value>"')
delete a

create a = {id: "<PK_VALUE>", etc}

ノードの場合、および多対多の中間テーブルに含める必要があるため、次のようになります。

start LHS = node:node_auto_index('id:"<LHS_PK>"'),
      RHS = node:node_auto_index('id:"<RHS_PK>"')
create unique LHS=[:<relType> {<rel props>}]->RHS

これで、重複がなくなり、好きなだけ再実行できます。

于 2013-04-12T13:30:33.003 に答える
1

この関数を使用します。ここで、IDは、すでに存在するかどうかを確認するキーです。Type:は、ノードのタイプ(ラベル)です。この関数は、ノードを作成して返します。その後、さらにプロパティを追加できます。

public static Node getOrCreateUserWithUniqueFactory( long ID, GraphDatabaseService graphDb, String Type )
{
    UniqueFactory<Node> factory = new UniqueFactory.UniqueNodeFactory( graphDb, Type )
    {
        @Override
        protected void initialize( Node created, Map<String, Object> properties )
        {

            created.addLabel( DynamicLabel.label( Type ) );
            created.setProperty( "ID", properties.get( "ID" ) );
        }
    };

    return factory.getOrCreate( "ID", ID );
}
于 2015-06-06T16:20:35.310 に答える
0

サイファークエリを使用すると、次の構文で一意のノードを作成できます。

CYPHER 2.0 merge (x:node_auto_index{id:1})

REST呼び出しを行う場合、次のようにバッチ挿入を行うことができます。

$lsNodes[] = array(

            'method'=> 'POST', 'to'=> '/cypher',

            'body' => array(
                'query' => 'CYPHER 2.0 merge (x:node_auto_index{id_item:{id}})',
                'params'    =>  array('id'=>1)
            ),
            'id'=>0

        );

        $sData = json_encode($lsNodes);

同様に、バッチリクエストでリレーションシップを作成するには、次の手順を実行します

$lsNodes[] = array(

                        'method'=> 'POST', 'to'=> '/cypher',

                        'body'  => array(
                            'query'     => 'start a=node:node_auto_index(id={id1}), b = node:node_auto_index(id={id2}) create unique a-[:have{property:30}}]-b;',
                            'params'    => array(
                                'id1'  => 1, 'id2'=>  2
                            )
                        ),
                        'id'    => 0

                    );
$sData = json_encode($lsNodes);
于 2013-06-14T15:03:40.787 に答える