如何在Neo4j中将节点聚集在一起

时间:2016-07-12 01:21:49

标签: neo4j

我的图表是1M节点。数据模型有意简单。有实体和IDType节点。单个实体可以具有1:多个IDType节点。并且IDType节点可以连接到1:多个实体。这形成了图表。

我们的目标是找到所有连接在一起的IDType和实体集群到我称之为节点集群的子集中(我想有人称之为子图)。想象一下,如果我们有1M节点。我想在图表数据中找到这样的“集群”,我正试图弄清楚如何做到这一点。我已经编写了我认为可以做到的密码查询,但是我不清楚它是否正在执行预期的操作。

问题:我如何有效地遍历我的图并将节点集群在一起,以便有一行或一组行可以作为基于行的结果集返回到我的python驱动程序,然后在该集群上运行。虽然这不一定是我的结果的确切结构,但这是我正在寻找的感觉。

集群|节点 1 | 2,3,4,5,6,7 2 | 10,11,12,13 3 | 15,17,19,20,21,25,27,28,33

“群集”是节点列表的一些任意聚类(坦率地说,如果我只有一行只是一组聚类或其他方式告诉它们都是相关的,那么我就是金色的)。 “nodes”数表示一个唯一的基于整数的属性,我们将其标记到每个Entity节点。

查询如下。概念是“实体”节点可以有1个或多个“ID”节点,并且我试图通过关系“HAS_ID”获得彼此相关的所有“实体”和“ID”。

从概念上讲,如果数据中存在关系,例如此Entity1 - > ID1< - Entity2 - > ID2< - Entity3 - > ID3< - Entity4 - > ID4< ; - Entity5然后我想将它们“聚集”在一起,这样我就可以创建一个代表这组节点的唯一编号。在我的例子中,有5个实体,但可能很容易就是2个实体,或者50个实体,它们彼此相关,这就是为什么我认为可变长度路径是我需要的。

以下是我尝试在图表中执行此操作。但1)这是正确的吗? 2)它是否有效,因为它似乎无限期地运行3)我如何最好地将这些“组合”在一起?

match 
(n:Entity)-[e1:HAS_ID*]-(o)
where n.key <> o.key
return *
limit 10
;

我也试过

match (n:Entity)-[e1:HAS_ID*]-(o)
where n.key <> o.key
with distinct n.key as key_1, o.key as key_2
return key_1, collect(key_2)
limit 100
;

这个似乎接近我想要的,但我仍然没有为给定的密钥获得一个组,换句话说,我可以返回5行,但它们仍然是相关的,在这种情况下我宁愿有一行...他就是一个例子,你可以看到第49和第二行的键是“49518”,我宁愿有一行将它们组合在一起。< / p>

49518   [49004, 49871, 49940, 50525, 49101, 49625, 50165, 50017, 49098, 50383]
49940   [49088, 49706, 50292, 50470, 49140, 49258, 49216, 49559, 50004, 50346, 49237, 49518, 49894, 49101, 49625, 50165, 50017, 49098, 50383]

1 个答案:

答案 0 :(得分:0)

嗯,首先,您的查询与您描述的关系模式不匹配。

模式中的每个箭头都是[:HAS_ID]关系,因此如果实体和ID始终在每个关系之间交替,那么您当前的查询只会匹配以下模式:

 <div class="card-columns">

        <div class="card" style="width: 18rem;">
            <img class="card-img-top" data-src="..." alt="Card image cap">
            <div class="card-block">
                <h4 class="card-title">Card title</h4>
                <p class="card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
            </div>
        </div>
        <div class="card"style="width: 18rem;">
            <img class="card-img-top" data-src="..." alt="Card image cap">
            <div class="card-block">
                <h4 class="card-title">Card title</h4>
                <p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
                <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
            </div>
        </div>
        <div class="card" style="width: 18rem;">
            <img class="card-img-top" data-src="..." alt="Card image cap">
            <div class="card-block">
                <h4 class="card-title">Card title</h4>
                <p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>
                <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
            </div>
        </div>
        <div class="card" style="width: 18rem;">
            <img class="card-img-top" data-src="..." alt="Card image cap">
            <div class="card-block">
                <h4 class="card-title">Card title</h4>
                <p class="card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
            </div>
        </div>
        <div class="card" style="width: 18rem;">
            <img class="card-img-top" data-src="..." alt="Card image cap">
            <div class="card-block">
                <h4 class="card-title">Card title</h4>
                <p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
                <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
            </div>
        </div>
        <div class="card" style="width: 18rem;">
            <img class="card-img-top" data-src="..." alt="Card image cap">
            <div class="card-block">
                <h4 class="card-title">Card title</h4>
                <p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>
                <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
            </div>
        </div>
    </div>

3个实体,2个ID,4个关系。这与您的5个实体,4个ID和8个关系的示例模式不匹配。所以至少,你想要改变你的模式以使用* 8.

至于效率......您尝试做的事情看起来效率相当低,因为它必须尝试在图中的每个单独的实体节点上找到这种模式,尝试它找到的每一个:HAS_ID关系。如果您的整个图形由以下相同模式构成:实体和:ID和:HAS_ID,那么您的查询将遍历整个图形,而不是多次遍历。

您将获得重复的结果。即使我们假设你的整个图形由孤立的5个实体/ 4个ID / 8关系链组成,就像你的例子一样(一个实体要么在链的末端,只有一个链接到一个ID,或者某个地方)在中间有2个ID的链接),那么你将为同一组节点获得2个匹配,一个匹配来自链的一端,另一个匹配另一端。这就是一个简单的例子......我猜测你的图形可能比这复杂得多,允许许多不同模式的更多可能性在完全相同的节点组上匹配。使用模式的唯一路径不等于唯一的节点分组。

至少,您可能希望匹配模式并使用RETURN DISTINCT NODES(p)来强制执行唯一的节点集,但我仍然认为匹配可能需要相当长的时间。< / p>