ソーシャル ネットワーク分析に使用する単純な neo4j データベースがあります。データベースは、ユーザー ノードと、電話番号や住所など、ユーザーが共通に持つ可能性のあるその他のノードで構成されます。関係 [:HAS] のタイプは 1 つだけです。ユーザーが別のユーザーと一致するには、間に少なくとも 1 つのノードをトラバースする必要があります。
私たちの目的は、このデータをグラフに保存し、R 光沢のあるアプリをデプロイしてユーザー ID を入力し、接続されているユーザーの完全なネットワークを確認することです。これを行うには、接続されたサブグラフからすべてのノードと関係をエッジ データ フレームにプルする必要があります。
次の暗号クエリを使用して、ある程度の成功を収めました。ただし、このクエリは、最大 5 度の接続離れたノードのみをプルします。高度に接続されたノードでも失敗します-プロセスでneo4jインスタンスがフリーズします。グラフ データをエッジ データ フレームに変換するために使用すべき、より効率的な方法はありますか?
edges_query=paste('MATCH (c0:user {userID:',as.character(cust_id),'})-[]->(l1)
OPTIONAL MATCH (l1)<-[]-(c1)
where id(c1) <> id(c0)
OPTIONAL MATCH (c1)-[]->(l2)
where id(l2) <> id(l1)
OPTIONAL MATCH (l2)<-[]-(c2)
where id(c2) <> id(c0)
OPTIONAL MATCH (c2)-[]->(l3)
where id(l3) <> id(l2)
OPTIONAL MATCH (l3)<-[]-(c3)
where id(c3) <> id(c2)
OPTIONAL MATCH (c3)-[]->(l4)
where id(l4) <> id(l3)
OPTIONAL MATCH (l4)<-[]-(c4)
where id(c4) <> id(c3)
OPTIONAL MATCH (c4)-[]->(l5)
where id(l5) <> id(l4)
OPTIONAL MATCH (l5)<-[]-(c5)
where id(c5) <> id(c4)
return
ID(c0) as c0_node_id
, c0.userID as c0_user_id
, ID(l1) as l1_node_id
, LABELS(l1) as l1_node_type
, ID(c1) as c1_node_id
, c1.userID as c1_user_id
, id(l2) as l2_node_id
, labels(l2) as l2_node_type
, ID(c2) as c2_node_id
, c2.userID as c2_user_id
, id(l3) as l3_node_id
, labels(l3) as l3_node_type
, ID(c3) as c3_node_id
, c3.userID as c3_user_id
, id(l4) as l4_node_id
, labels(l4) as l4_node_type
, ID(c4) as c4_node_id
, c4.userID as c4_user_id
, id(l5) as l5_node_id
, labels(l5) as l5_node_type
, ID(c5) as c5_node_id
, c5.userID as c5_user_id
',sep='')