选择子图中所有连接的节点,并在 R 可视化效果中显示特定起点

Selecting all connected nodes in a sub-graph with a specific starting point to display in an R visualization

提问人:Tyler Balamas 提问时间:5/10/2016 更新时间:5/10/2016 访问量:1042

问:

我有一个简单的neo4j数据库,用于社交网络分析。数据库由用户节点和用户可能具有的其他共同节点(如电话或地址)组成。只有一种类型的关系 [:HAS]。要使一个用户与另一个用户匹配,他们必须遍历中间的至少一个节点。

我们的目标是将这些数据存储在图表中,并部署一个 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='')
密码器 R-NEO4J

评论


答:

2赞 Nicole White 5/10/2016 #1

您应该在 Cypher 中使用可变长度路径匹配语法。这个语法是 ,例如 其中默认值为 1。[:REL_TYPE*min..max][:HAS*..5]min

您还应该使用参数而不是构建字符串。而不是 用于嵌入 ,而是在查询中使用命名参数,并在运行函数时将其替换为其值,例如pastecust_idcypher

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

然后,您可以在带有 renderVisNetwork 的 Shiny 应用程序中轻松使用它。