图的密码查询
Cypher query for graph
如何确定图中每个节点的入度和出度以及总度。此外,图的最长路径因此图的直径和图的密度。最后两个问题是每种类型的关系数,以及每个标签的节点数。
我的数据集如下所示:
我使用这个查询来加载数据集:
LOAD CSV WITH HEADERS FROM 'file:///vgsales.csv' AS line
CREATE (v:Vgsales {
rank: toInteger(line.Rank),
name: line.Name,
platform: line.Platform,
year: toInteger(line.Year)
})
MERGE (g:GENRE {genre: line.Genre})
MERGE (p:PUBLISHER {
publisher: line.Publisher,
NA_sales: toInteger(line.NA_Sales),
EU_sales: toInteger(line.EU_Sales),
JP_sales: toInteger(line.JP_Sales),
Other_sales: toInteger(line.Other_Sales),
Global_sales: toInteger(line.Global_Sales)
})
MERGE (v)-[:IN_GENRE]->(g)
MERGE (p)-[:PUBLISHED]->(v)
对于一个节点,您可以使用 size(<pattern>)
来查找模式的度数(假设没有为另一个节点提供标签,并且模式中没有属性,因为那些需要实际扩展路径查找和过滤这些东西)。
因此,要获得图中所有节点的所有入度和出度,您可以使用:
MATCH (n)
RETURN id(n) as id, size((n)-->()) as outDegree, size((n)<--()) as inDegree
图中的直径是每个节点之间的所有最短路径中最长的,所以需要两个节点的每一个组合首先得到最短路径,然后只取最长的:
MATCH (n)
WITH collect(n) as allNodes
UNWIND allNodes as a
UNWIND allNodes as b
WITH a, b
WHERE id(a) < id(b)
MATCH path = shortestPath((a)-[*]-(b))
RETURN max(length(path)) as diameter
id(a) < id(b)
限制是为了确保我们过滤掉 a 和 b 是同一节点的行,并过滤掉镜像结果,因为我们只需要 a 和 b 的单个组合(而不是计算第二次交换 a 和 b 时)。
对于每个关系的计数,以及按标签的节点计数,这些都存储在计数存储中,访问这些统计信息的最简单方法是通过 APOC 程序。这可以预先捆绑,查看此安装页面(更改您在 url 中使用的次要版本以获得更具体的说明):
https://neo4j.com/labs/apoc/4.1/installation/
安装后,您可以使用 CALL apoc.meta.stats()
访问所有图形计数。 nodeCount
列将为您提供图中的总节点数,labels
列将为您提供每个标签的计数。 relTypesCount
列将为您提供每种关系类型的计数。
我认为对于图密度,对于有向图,它是 E / (V (V - 1))
,其中 E 是总边数,V 是总顶点数。我们可以从计数存储中获取这些并使用该公式:
CALL apoc.meta.stats() YIELD nodeCount, relCount
RETURN toFloat(relCount) / (nodeCount * (nodeCount - 1)) as density
如何确定图中每个节点的入度和出度以及总度。此外,图的最长路径因此图的直径和图的密度。最后两个问题是每种类型的关系数,以及每个标签的节点数。
我的数据集如下所示:
我使用这个查询来加载数据集:
LOAD CSV WITH HEADERS FROM 'file:///vgsales.csv' AS line
CREATE (v:Vgsales {
rank: toInteger(line.Rank),
name: line.Name,
platform: line.Platform,
year: toInteger(line.Year)
})
MERGE (g:GENRE {genre: line.Genre})
MERGE (p:PUBLISHER {
publisher: line.Publisher,
NA_sales: toInteger(line.NA_Sales),
EU_sales: toInteger(line.EU_Sales),
JP_sales: toInteger(line.JP_Sales),
Other_sales: toInteger(line.Other_Sales),
Global_sales: toInteger(line.Global_Sales)
})
MERGE (v)-[:IN_GENRE]->(g)
MERGE (p)-[:PUBLISHED]->(v)
对于一个节点,您可以使用 size(<pattern>)
来查找模式的度数(假设没有为另一个节点提供标签,并且模式中没有属性,因为那些需要实际扩展路径查找和过滤这些东西)。
因此,要获得图中所有节点的所有入度和出度,您可以使用:
MATCH (n)
RETURN id(n) as id, size((n)-->()) as outDegree, size((n)<--()) as inDegree
图中的直径是每个节点之间的所有最短路径中最长的,所以需要两个节点的每一个组合首先得到最短路径,然后只取最长的:
MATCH (n)
WITH collect(n) as allNodes
UNWIND allNodes as a
UNWIND allNodes as b
WITH a, b
WHERE id(a) < id(b)
MATCH path = shortestPath((a)-[*]-(b))
RETURN max(length(path)) as diameter
id(a) < id(b)
限制是为了确保我们过滤掉 a 和 b 是同一节点的行,并过滤掉镜像结果,因为我们只需要 a 和 b 的单个组合(而不是计算第二次交换 a 和 b 时)。
对于每个关系的计数,以及按标签的节点计数,这些都存储在计数存储中,访问这些统计信息的最简单方法是通过 APOC 程序。这可以预先捆绑,查看此安装页面(更改您在 url 中使用的次要版本以获得更具体的说明):
https://neo4j.com/labs/apoc/4.1/installation/
安装后,您可以使用 CALL apoc.meta.stats()
访问所有图形计数。 nodeCount
列将为您提供图中的总节点数,labels
列将为您提供每个标签的计数。 relTypesCount
列将为您提供每种关系类型的计数。
我认为对于图密度,对于有向图,它是 E / (V (V - 1))
,其中 E 是总边数,V 是总顶点数。我们可以从计数存储中获取这些并使用该公式:
CALL apoc.meta.stats() YIELD nodeCount, relCount
RETURN toFloat(relCount) / (nodeCount * (nodeCount - 1)) as density