使用一个采样密码查询来筛选另一个采样密码查询返回的路径



我在Neo4j数据库中有一个大的有向图,并希望提取一个代表性的样本子图,同时尊重图的结构。

每个节点都有一个UTHAE标签。该图是树林,每棵树的根是一个U节点。叶节点可以是THAE节点。中间节点仅是T节点。对于提取物,

  1. 我希望省略任何AE(叶(节点。
  2. 我想要森林中树木的10%样本。

请注意,基于节点简单采样的数据提取将具有与整体图形不同的结构。

路径扩展的 APOC 过程应该非常有帮助。

例如,要获得 10% 的子图(作为节点(:

MATCH (root:U)
WHERE rand() < .1
CALL apoc.path.subgraphNodes(root, {labelFilter:'-A|E'}) YIELD node
RETURN root, COLLECT(node) AS subgraph_nodes;

labelFilter值指定应将AE节点列入黑名单。您说您不想将它们作为叶节点返回,并且您的描述暗示它们仅用作叶节点。

我发现了一个Sample一个Neo4j数据库,它帮助我编写了密码查询的第一部分:

MATCH (selectedU:U) WHERE rand() < 0.1 RETURN selectedU;

根据需要返回大约 10% 的U节点。

以下查询返回我需要的节点和关系(来自整个图形,因为尚未应用采样!

MATCH p=(u:U)-->(n1)-[*]->(n2)
WHERE n1:T AND (n2:T OR n2:H)
WITH nodes(p) AS nodePairsInPath
UNWIND nodePairsInPath AS nodes
RETURN DISTINCT nodes AS g
UNION ALL
MATCH p=(u:U)-->(n1)-[*]->(n2)
WHERE n1:T AND (n2:T OR n2:H)
WITH relationships(p) AS relPairsInPath
UNWIND relPairsInPath AS rels
RETURN DISTINCT rels AS g;

我合并了两个密码查询,以便仅返回以所选U节点开头的路径中的节点和关系:

MATCH (selectedU:U) WHERE rand() < 0.1
WITH selectedU
MATCH p=(selectedU)-->(n1)-[*]->(n2)
WHERE n1:T AND (n2:T OR n2:H)
WITH nodes(p) AS nodePairsInPath
UNWIND nodePairsInPath AS nodes
RETURN DISTINCT nodes AS g
UNION ALL
MATCH p=(selectedU)-->(n1)-[*]->(n2)
WHERE n1:T AND (n2:T OR n2:H)
WITH relationships(p) AS relPairsInPath
UNWIND relPairsInPath AS rels
RETURN DISTINCT rels AS g;

还有一个小问题,如果采样量太小(因此找不到selectedU(,组合查询会返回UTH节点之间的关系。在这种边缘情况下,查询最好不返回任何记录(节点或关系(。

我认为这可能是一个常见的用例,需要随机子图,但子图需要遵循整体图的结构。 作为一个新手密码用户,这对我来说非常具有挑战性,所以我在这里发布它,希望它可以使具有类似要求的其他人受益。

写这个密码查询教会了我很多关于语言的知识,尽管我希望密码专家可以做得更好......

最新更新