2016-05-09 3 views
1

私はソーシャルネットワーク分析に使用する簡単なneo4jデータベースを持っています。データベースは、ユーザーノードと、電話やアドレスなど、ユーザーが共通に持つ可能性のある他のノードで構成されています。リレーションシップのタイプは[:HAS]のみです。ユーザーが別のユーザーと一致させるには、その間に少なくとも1つのノードを通過する必要があります。R視覚化で表示する特定の開始点を持つサブグラフ内のすべての接続ノードを選択

私たちの目的は、このデータをグラフに保存し、ユーザーIDを入力して接続されたユーザーの完全なネットワークを確認するためにR shinyアプリケーションを展開することです。これを行うには、接続されたサブグラフからすべてのノードおよび関係をエッジデータフレームにプルする必要があります。

次のサイファークエリを使用していくつかの成功を収めました。ただし、この問合せではノードを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='') 

答えて

2

Cypherでは、可変長のパスマッチング構文を使用する必要があります。この構文は[:REL_TYPE*min..max]です。 [:HAS*..5]デフォルトのminは1です。

また、文字列を作成する代わりにパラメータを使用する必要があります。 pasteを使用してcust_idを埋め込む代わりに、クエリに名前付きパラメータを使用し、cypher関数を実行するときにその値に置き換えます。

cypher(graph, "MATCH (n:User {userID: {cust_id} }) RETURN n.userID", cust_id=12345) 

例グラフを使用してどのように行うかの例を示します。

library(RNeo4j) 
library(visNetwork) 

vis = function(edges) { 
    nodes = data.frame(id=unique(c(edges$from, edges$to))) 
    nodes$label = nodes$id 
    visNetwork(nodes, edges) 
} 

graph = startGraph("http://localhost:7474/db/data") 

query = " 
MATCH p = (:User {userID: {cust_id}})-[:HAS*..5]-(:User) 
WITH [x IN nodes(p) WHERE x:User] AS users 
UNWIND range(1, size(users) - 1) AS idx 
WITH users[idx - 1] AS from, users[idx] AS to 
RETURN DISTINCT from.userID AS from, to.userID AS to; 
" 

edges = cypher(graph, query, cust_id="Tom Cruise") 
vis(edges) 

私はのNeo4jに付属のモデルに合うようにすることを映画のグラフを編集しました。あなたは、簡単にrenderVisNetworkで光沢のあるアプリでこれを使用することができます

visNetwork

:上記のコードは私にRStudioに次のようになります。

関連する問題