Java 如何通过OrientDB中的Graph API(Tinkerpop蓝图)按边检索顶点?

Java 如何通过OrientDB中的Graph API(Tinkerpop蓝图)按边检索顶点?,java,graph,orientdb,tinkerpop-blueprint,Java,Graph,Orientdb,Tinkerpop Blueprint,我是OrientDB的新手。作为一名Java开发人员,我选择GraphAPI作为OrientDB的连接器 在这里,我创建了一个非常简单的代码示例: package launcher; import com.tinkerpop.blueprints.Graph; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx; import com.tinke

我是OrientDB的新手。作为一名Java开发人员,我选择GraphAPI作为OrientDB的连接器

在这里,我创建了一个非常简单的代码示例:

package launcher;

import com.tinkerpop.blueprints.Graph;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx;
import com.tinkerpop.frames.FramedGraph;
import com.tinkerpop.frames.FramedGraphFactory;

public class TinkerpopTest {

    public static void main(String[] args) {

        OrientGraphNoTx graph = new OrientGraphNoTx("memory:tinkerpop");
        FramedGraphFactory factory = new FramedGraphFactory();
        FramedGraph<Graph> manager = factory.create(graph);

        Vertex marko = graph.addVertex("class:Person");
        marko.setProperty("name", "marko");
        marko.setProperty("age", 29);

        Vertex vadas = graph.addVertex("class:Person");
        vadas.setProperty("name", "vadas");
        vadas.setProperty("age", 27);

        Vertex lop = graph.addVertex("class:Person");
        lop.setProperty("name", "lop");
        lop.setProperty("lang", "java");

        Vertex josh = graph.addVertex("class:Person");
        josh.setProperty("name", "josh");
        josh.setProperty("age", 32);

        Vertex ripple = graph.addVertex("class:Person");
        ripple.setProperty("name", "ripple");
        ripple.setProperty("lang", "java");

        Vertex peter = graph.addVertex("class:Person");
        peter.setProperty("name", "peter");
        peter.setProperty("age", 35);

        graph.addEdge("class:Person", marko, vadas, "knows").setProperty("weight", 0.5f);
        graph.addEdge("class:Person", marko, josh, "knows").setProperty("weight", 1.0f);
        graph.addEdge("class:Person", marko, lop, "created").setProperty("weight", 0.4f);

        graph.addEdge("class:Person", josh, ripple, "created")
                .setProperty("weight", 1.0f);
        graph.addEdge("class:Person", josh, lop, "created").setProperty("weight", 0.4f);

        graph.addEdge("class:Person", peter, lop, "created").setProperty("weight", 0.2f);
    }
}
包启动器;
导入com.tinkerop.blueprints.Graph;
导入com.tinkerpop.blueprints.Vertex;
导入com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx;
导入com.tinkerpop.frames.FramedGraph;
导入com.tinkerpop.frames.FramedGraphFactory;
公共级修补匠{
公共静态void main(字符串[]args){
OrientGraphNoTx图形=新的OrientGraphNoTx(“内存:tinkerpop”);
FramedGraphFactory=新FramedGraphFactory();
FramedGraph manager=factory.create(图形);
顶点标记=graph.addVertex(“类:Person”);
marko.setProperty(“名称”、“marko”);
marko.setProperty(“年龄”,29岁);
Vertex vadas=graph.addVertex(“类:Person”);
setProperty(“名称”、“vadas”);
vadas.setProperty(“年龄”,27岁);
顶点lop=graph.addVertex(“类:人”);
lop.setProperty(“名称”、“lop”);
lop.setProperty(“lang”、“java”);
顶点josh=graph.addVertex(“类:Person”);
josh.setProperty(“名称”、“josh”);
josh.setProperty(“年龄”,32岁);
顶点波纹=graph.addVertex(“类:人”);
ripple.setProperty(“名称”、“ripple”);
setProperty(“lang”、“java”);
顶点彼得=graph.addVertex(“类:人”);
peter.setProperty(“名称”、“peter”);
peter.setProperty(“年龄”),35岁;
图.附录(“类别:人”,marko,vadas,“知道”).setProperty(“重量”,0.5f);
graph.addEdge(“类:人”,marko,josh,“知道”).setProperty(“重量”,1.0f);
图.附录(“类别:人”,marko,lop,“创建”).setProperty(“重量”,0.4f);
添加的图形(“类:人”,josh,ripple,“创建”)
.setProperty(“重量”,1.0f);
图.附录(“类别:人”,josh,lop,“创建”).setProperty(“重量”,0.4f);
图.附录(“类别:人”,彼得,洛普,“创建”).setProperty(“重量”,0.2f);
}
}
和人员类别:

package launcher;

import com.tinkerpop.frames.Adjacency;
import com.tinkerpop.frames.Property;

public interface Person {

    @Property("name")
    String getName();

    @Property("name")
    void setName(String name);

    @Property("age")
    int getAge();

    @Property("age")
    void setAge(int age);

    @Adjacency(label = "knows")
    Iterable<Person> getKnowsPeople();

    @Adjacency(label = "knows")
    void addKnowsPerson(Person person);
}
包启动器;
导入com.tinkerpop.frames.adjacence;
导入com.tinkerpop.frames.Property;
公共接口人员{
@财产(“名称”)
字符串getName();
@财产(“名称”)
void setName(字符串名);
@财产(“年龄”)
int getAge();
@财产(“年龄”)
无效设置(整数);
@邻接(label=“knows”)
Iterable getKnowsPeople();
@邻接(label=“knows”)
无效addKnowsPerson(个人);
}
我正在使用maven构建我的应用程序,以下是项目依赖项:

<dependencies>
    <dependency>
        <groupId>com.orientechnologies</groupId>
        <artifactId>orientdb-core</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.orientechnologies</groupId>
        <artifactId>orientdb-graphdb</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.orientechnologies</groupId>
        <artifactId>orientdb-object</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.tinkerpop.blueprints</groupId>
        <artifactId>blueprints-core</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>com.tinkerpop</groupId>
        <artifactId>frames</artifactId>
        <version>2.6.0</version>
    </dependency>
</dependencies>

面向对象技术
定向数据库核心
3.0.1
面向对象技术
定向数据库图形
3.0.1
面向对象技术
orientdb对象
3.0.1
com.tinkerpop.blueprints
核心蓝图
2.6.0
小叮当
框架
2.6.0
此代码示例来自tinkerpop源代码。正如你们看到的,我们这里有顶点类型的“Person”和一些边,比如“knows”和“created”。现在我了解了如何创建顶点和边,以及如何向它们添加元素。但问题是,我不知道如何根据边从图中检索元素。我知道如何根据数据的属性(如年龄等)检索数据,但问题是我不了解如何根据边缘检索数据。e、 g.如何通过Graph API(Tinkerpop Blueprints)找到上面所示示例中不“认识”任何人的顶点?

尝试以下方法:

Iterable<Vertex> people=peter.getVertices(Direction.OUT, "knows");
Iterable<OVertex> OVertex().getVertices(ODiriection dir, String... name) (version 3.0)
Iterable people=peter.getVertices(Direction.OUT,“knows”);
Iterable OVertex().getVertices(操作目录,字符串…名称)(版本3.0)
通过这种方式,您可以定义起始顶点、搜索方向和要跨越的边的名称。这将返回所有连接顶点的列表,例如peter

希望能有帮助


关于

如果您使用的是OrientDB 2.x,它实现了Tinkerpop 2(又名Blueprints),并且不支持您想要的内容

相反,您必须使用OrientDB本机SQL

String sqlQuery = "select from Person where outE('knows').size() = 0";

Iterable<Vertex> lonelyPeople = oGraph.command(new OCommandSQL(sqlQuery)).execute();
String sqlQuery=“从outE('knows')所在的人中选择。size()=0”;
Iterable lonelyPeople=oGraph.command(新的OCommandSQL(sqlQuery)).execute();

在本例中,您只搜索“peter”的已知联系人,但我需要获取所有没有“knows.OUT”边的顶点。