Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【求助】使用Traversal API快速查找出目标label 的节点 #482

Closed
billc114 opened this issue Apr 22, 2024 · 7 comments
Closed

Comments

@billc114
Copy link

看了半天官方文档和源码UT,但是没有看明白怎么使用Traversal API快速查找出目标label 的节点。
我写了如下代码:

    lgraph_api::traversal::FrontierTraversal front_traver(db, txn, lgraph_api::traversal::TRAVERSAL_PARALLEL);
    front_traver.SetFrontier([&](VertexIterator &vit) {return vit.GetLabel() == "MyLabel";});

期望将lebel== "MyLabel"的节点查询出来,然后遍历打印它们的ID,获取它们的边,请问该怎么做?

@GongChangYan
Copy link
Contributor

GongChangYan commented Apr 23, 2024

您好,期望将lebel== "MyLabel"的节点查询出来,然后遍历打印它们的ID,获取它们的边,可以在您的代码后使用ParallelVector<size_t>& vertices_id = front_traver.GetFrontier();得到点的id,然后通过VertexIterator::GetOutEdgeIterator来获取边

也可以使用PathTraversal来获取,代码可以这样写

lgraph_api::traversal::PathTraversal path_traver(db, txn, lgraph_api::traversal::TRAVERSAL_PARALLEL);
front_traver.SetFrontier([&](VertexIterator &vit) {return vit.GetLabel() == "MyLabel";});

ParallelVector<Path>& path0 = front_traver.GetFrontier();
for (auto &path :  path0) {
    // 现在的path只包含1个点(label== "MyLabel"的点)
    LOG_INFO() << path.GetStartVertex().GetId();
}

path_traver.ExpandOutEdges();
ParallelVector<Path>& path1 = front_traver.GetFrontier();
for (auto &path :  path1) {
    // 现在的path只包含1条边,起点为(label== "MyLabel"的点),GetNthEdge获取边
     auto edge = path.GetNthEdge(0);
}

@billc114
Copy link
Author

您好,期望将lebel== "MyLabel"的节点查询出来,然后遍历打印它们的ID,获取它们的边,可以在您的代码后使用ParallelVector<size_t>& vertices_id = front_traver.GetFrontier();得到点的id,然后通过VertexIterator::GetOutEdgeIterator来获取边

也可以使用PathTraversal来获取,代码可以这样写

lgraph_api::traversal::PathTraversal path_traver(db, txn, lgraph_api::traversal::TRAVERSAL_PARALLEL);
front_traver.SetFrontier([&](VertexIterator &vit) {return vit.GetLabel() == "MyLabel";});

ParallelVector<Path>& path0 = front_traver.GetFrontier();
for (auto &path :  path0) {
    // 现在的path只包含1个点(label== "MyLabel"的点)
    LOG_INFO() << path.GetStartVertex().GetId();
}

path_traver.ExpandOutEdges();
ParallelVector<Path>& path1 = front_traver.GetFrontier();
for (auto &path :  path1) {
    // 现在的path只包含1条边,起点为(label== "MyLabel"的点),GetNthEdge获取边
     auto edge = path.GetNthEdge(0);
}

懂了!感谢感谢

Copy link

Hello @billc114, please star this repo if you find it useful! Thanks ⭐!

你好 @billc114。如果这个项目帮助到你,可以在仓库右上角 star 一下,感谢你的 ⭐!

@billc114 billc114 reopened this Apr 24, 2024
@billc114
Copy link
Author

billc114 commented Apr 24, 2024

您好,期望将lebel== "MyLabel"的节点查询出来,然后遍历打印它们的ID,获取它们的边,可以在您的代码后使用ParallelVector<size_t>& vertices_id = front_traver.GetFrontier();得到点的id,然后通过VertexIterator::GetOutEdgeIterator来获取边

也可以使用PathTraversal来获取,代码可以这样写

lgraph_api::traversal::PathTraversal path_traver(db, txn, lgraph_api::traversal::TRAVERSAL_PARALLEL);
front_traver.SetFrontier([&](VertexIterator &vit) {return vit.GetLabel() == "MyLabel";});

ParallelVector<Path>& path0 = front_traver.GetFrontier();
for (auto &path :  path0) {
    // 现在的path只包含1个点(label== "MyLabel"的点)
    LOG_INFO() << path.GetStartVertex().GetId();
}

path_traver.ExpandOutEdges();
ParallelVector<Path>& path1 = front_traver.GetFrontier();
for (auto &path :  path1) {
    // 现在的path只包含1条边,起点为(label== "MyLabel"的点),GetNthEdge获取边
     auto edge = path.GetNthEdge(0);
}

1、请问如果这个节点有两条edge,这样匹配之后是不是会出现两个path?
2、另外 path.GetStartVertex()似乎只能获取Id,不能获取type和property?

@GongChangYan
Copy link
Contributor

您好,期望将lebel== "MyLabel"的节点查询出来,然后遍历打印它们的ID,获取它们的边,可以在您的代码后使用ParallelVector<size_t>& vertices_id = front_traver.GetFrontier();得到点的id,然后通过VertexIterator::GetOutEdgeIterator来获取边
也可以使用PathTraversal来获取,代码可以这样写

lgraph_api::traversal::PathTraversal path_traver(db, txn, lgraph_api::traversal::TRAVERSAL_PARALLEL);
front_traver.SetFrontier([&](VertexIterator &vit) {return vit.GetLabel() == "MyLabel";});

ParallelVector<Path>& path0 = front_traver.GetFrontier();
for (auto &path :  path0) {
    // 现在的path只包含1个点(label== "MyLabel"的点)
    LOG_INFO() << path.GetStartVertex().GetId();
}

path_traver.ExpandOutEdges();
ParallelVector<Path>& path1 = front_traver.GetFrontier();
for (auto &path :  path1) {
    // 现在的path只包含1条边,起点为(label== "MyLabel"的点),GetNthEdge获取边
     auto edge = path.GetNthEdge(0);
}

1、请问如果这个节点有两条edge,这样匹配之后是不是会出现两个path? 2、另外 path.GetStartVertex()似乎只能获取Id,不能获取type和property?

  1. 是2个path,edge不同path当然是不同的
  2. path中只存了点id,如果要type和property需要使用使用VertexIterator,通过VertexIterator::GetLabel 和 VertexIterator::GetField
auto vit = txn.GetVertexIterator();
vit.Goto(id);

@billc114
Copy link
Author

您好,期望将lebel== "MyLabel"的节点查询出来,然后遍历打印它们的ID,获取它们的边,可以在您的代码后使用ParallelVector<size_t>& vertices_id = front_traver.GetFrontier();得到点的id,然后通过VertexIterator::GetOutEdgeIterator来获取边
也可以使用PathTraversal来获取,代码可以这样写

lgraph_api::traversal::PathTraversal path_traver(db, txn, lgraph_api::traversal::TRAVERSAL_PARALLEL);
front_traver.SetFrontier([&](VertexIterator &vit) {return vit.GetLabel() == "MyLabel";});

ParallelVector<Path>& path0 = front_traver.GetFrontier();
for (auto &path :  path0) {
    // 现在的path只包含1个点(label== "MyLabel"的点)
    LOG_INFO() << path.GetStartVertex().GetId();
}

path_traver.ExpandOutEdges();
ParallelVector<Path>& path1 = front_traver.GetFrontier();
for (auto &path :  path1) {
    // 现在的path只包含1条边,起点为(label== "MyLabel"的点),GetNthEdge获取边
     auto edge = path.GetNthEdge(0);
}

1、请问如果这个节点有两条edge,这样匹配之后是不是会出现两个path? 2、另外 path.GetStartVertex()似乎只能获取Id,不能获取type和property?

  1. 是2个path,edge不同path当然是不同的
  2. path中只存了点id,如果要type和property需要使用使用VertexIterator,通过VertexIterator::GetLabel 和 VertexIterator::GetField
auto vit = txn.GetVertexIterator();
vit.Goto(id);

感谢耐心解答,另外
1、如果是outEdge的话能够匹配出来吗?
2、 auto vit = txn.GetVertexIterator(); vit.Goto(id);的性能如何呢,算不算又进行了一次匹配

@GongChangYan
Copy link
Contributor

您好,期望将lebel== "MyLabel"的节点查询出来,然后遍历打印它们的ID,获取它们的边,可以在您的代码后使用ParallelVector<size_t>& vertices_id = front_traver.GetFrontier();得到点的id,然后通过VertexIterator::GetOutEdgeIterator来获取边
也可以使用PathTraversal来获取,代码可以这样写

lgraph_api::traversal::PathTraversal path_traver(db, txn, lgraph_api::traversal::TRAVERSAL_PARALLEL);
front_traver.SetFrontier([&](VertexIterator &vit) {return vit.GetLabel() == "MyLabel";});

ParallelVector<Path>& path0 = front_traver.GetFrontier();
for (auto &path :  path0) {
    // 现在的path只包含1个点(label== "MyLabel"的点)
    LOG_INFO() << path.GetStartVertex().GetId();
}

path_traver.ExpandOutEdges();
ParallelVector<Path>& path1 = front_traver.GetFrontier();
for (auto &path :  path1) {
    // 现在的path只包含1条边,起点为(label== "MyLabel"的点),GetNthEdge获取边
     auto edge = path.GetNthEdge(0);
}

1、请问如果这个节点有两条edge,这样匹配之后是不是会出现两个path? 2、另外 path.GetStartVertex()似乎只能获取Id,不能获取type和property?

  1. 是2个path,edge不同path当然是不同的
  2. path中只存了点id,如果要type和property需要使用使用VertexIterator,通过VertexIterator::GetLabel 和 VertexIterator::GetField
auto vit = txn.GetVertexIterator();
vit.Goto(id);

感谢耐心解答,另外 1、如果是outEdge的话能够匹配出来吗? 2、 auto vit = txn.GetVertexIterator(); vit.Goto(id);的性能如何呢,算不算又进行了一次匹配

  1. path_traver.ExpandOutEdges();这里就是按照outEdge来查的,如果希望按照inEdge的方向,可以使用ExpandInEdges
  2. auto vit = txn.GetVertexIterator(); vit.Goto(id);没什么开销
  3. 之前的代码有点笔误ParallelVector<Path>& path0 = front_traver.GetFrontier();应该是ParallelVector<Path>& path0 = path_traver.GetFrontier(); 使用path_traver.GetFrontier()而不是front_traver.GetFrontier()。ParallelVector<Path>& path1 = front_traver.GetFrontier();同理改成path_traver

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants