1

ソーシャル ネットワーク分析に使用する単純な 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='')
4

1 に答える 1

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 に同梱されているムービー グラフを編集しました。上記のコードにより、RStudio で次の結果が得られます。

visNetwork

その後、これを Shiny アプリで簡単に使用できますrenderVisNetwork

于 2016-05-09T18:04:16.047 に答える