Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
neo4j-如何仅匹配前n个关系_Neo4j_Cypher - Fatal编程技术网

neo4j-如何仅匹配前n个关系

neo4j-如何仅匹配前n个关系,neo4j,cypher,Neo4j,Cypher,除了在LIMIT n之后进行过滤之外,是否有一种默认方法可以只匹配前n个关系 我有一个疑问: START n=node({id}) MATCH n--u--n2 RETURN u, count(*) as cnt order by cnt desc limit 10; 但是假设n--u关系的数量非常高,我想放松这个查询,以前100个随机关系为例,然后继续使用u--n2… 这是一个协作过滤任务,假设用户更不相似,我不想匹配所有用户u,而是随机子集。这种方法的性能应该更快——现在我得到了约500毫

除了在
LIMIT n
之后进行过滤之外,是否有一种默认方法可以只匹配前n个关系

我有一个疑问:

START n=node({id})
MATCH n--u--n2
RETURN u, count(*) as cnt order by cnt desc limit 10;
但是假设
n--u
关系的数量非常高,我想放松这个查询,以前100个随机关系为例,然后继续使用
u--n2…

这是一个协作过滤任务,假设用户更不相似,我不想匹配所有用户
u
,而是随机子集。这种方法的性能应该更快——现在我得到了约500毫秒的查询时间,但希望将其降低到50毫秒以下


我知道我可以将上面的查询分为两个单独的查询,但在第一个查询中,它会遍历所有用户,然后限制输出。我想在
匹配
阶段限制最大相对误差

您可以使用
对查询的当前结果进行管道传输,然后
限制这些初始结果,然后在同一查询中继续:

START n=node({id})
MATCH n--u
WITH u
LIMIT 10
MATCH u--n2
RETURN u, count(*) as cnt 
ORDER BY cnt desc 
LIMIT 10;
上面的查询将为您提供找到的前10个
u
s,然后继续查找前10个匹配的
n2
s


或者,您可以取消第二个
限制
,在前十个
u
s中,您将获得all匹配的
n2
s(这意味着如果它们匹配前十个
u
s,您可能会返回十多行)。

这不是您问题的直接解决方案,但由于我遇到了类似的问题,我的工作可能会让你感兴趣

我需要做的是:通过索引获取关系(可能会产生数千个)并获取这些关系的开始节点。因为开始节点与索引查询总是相同的,所以我只需要第一个关系的startnode

由于我无法使用cypher实现这一点(ean5533提出的查询的性能没有更好),因此我使用了一个简单的()

@GET
@路径(“/address/{address}”)
公共响应getUniqueIDofSenderAddress(@PathParam(“地址”)字符串地址,@Context GraphDatabaseService graphDB)引发IOException
{
试一试{
RelationshipIndex=graphDB.index()。用于关系(“交易”);
IndexHits rels=index.get(“发件人地址”,addr);
int unique_id=-1;
for(关系rel:rels){
节点发送方=rel.getStartNode();
unique_id=(整数)sender.getProperty(“unique_id”);
rels.close();
打破
}
返回Response.ok();
}捕获(例外e){
返回Response.serverError().entity(“无法获取唯一ID”).build();
}
}
对于这里的这个例子,加速是非常好的

我不知道您的具体使用情况,但由于Neo4j甚至支持HTTP流afaik,您应该能够创建一个将查询转换为非托管扩展,并且仍然能够获得完整的性能。
例如,“java查询”所有符合条件的节点,并将部分结果发送到HTTP流。

对,但我担心第一个
限制10
会限制所有找到的
u
,因此仍在处理
u
s,我不想这样做。或者有什么改变了吗?密码解析器现在没有遍历所有关系,而是只解析前10个关系?第一个
限制10
应该会导致遍历器在找到前10个
u
后停止。它不应该处理所有可能的
u
s。如果您怀疑它处理的内容超出了应有的范围,那么应该向neo4j提交一个bug。
@GET
@Path("/address/{address}")
public Response getUniqueIDofSenderAddress(@PathParam("address") String addr, @Context GraphDatabaseService graphDB) throws IOException
{
    try {
        RelationshipIndex index = graphDB.index().forRelationships("transactions");
        IndexHits<Relationship> rels = index.get("sender_address", addr);

        int unique_id = -1;
        for (Relationship rel : rels) {
            Node sender = rel.getStartNode();
            unique_id = (Integer) sender.getProperty("unique_id");
            rels.close();
            break;
        }

        return Response.ok().entity("Unique ID: " + unique_id).build();
    } catch (Exception e) {
        return Response.serverError().entity("Could not get unique ID.").build();
    }
}