Neo4j的使用

生成graph.db

这部分后面有时间再写

获取graph.db

读取graph的文件路径

        File home = new File("data/" + dataset);
        File graphFile = new File(home, "databases/graph.db");
        GraphDatabaseService graph = new GraphDatabaseFactory().newEmbeddedDatabase(graphFile);

使用graph

每次使用都要在事务范围内进行,不然会报错

try (Transaction tx = graph.beginTx()) {
           tx.success();
        }

获取下一跳的节点

要么获取id,要么获取属性,直接getNode()返回的类型只是node
获取节点,要看relationship的方向是outgoing还是incoming
如果relationship是outgoing,则下一跳的节点要relationship.getEndNode();如果relationship是incoming,则下一跳的节点要relationship.getStartNode();
获取下一跳node的id

  • relationship.getStartNodeId()或者relationship.getStartNode().getId()
  • relationship.getEndNodeId()或者relationship.getEndNode().getId()
            for(Relationship relationship:relationships){
                if(relationship.getType().name()==relation){
                    Pair pair;
                    if(direction==1){
                        long subId=relationship.getStartNodeId();
                        long objId=relationship.getEndNodeId();
                        pair=new Pair(subId,objId);
                    }
                    else{
                        long subId=relationship.getEndNodeId();
                        long objId=relationship.getStartNodeId();
                        pair=new Pair(subId,objId);
                    }
                    pairs.add(pair);
                }
            }

获取下一节点的属性

  • rel.getStartNode().getProperty("name")
  • rel.getEndNode().getProperty("name")
(String) rel.getStartNode().getProperty("name")
(String) rel.getEndNode().getProperty("name")

获取所有的relation

type.name()可以获取relation的String形式

            for (RelationshipType type : graph.getAllRelationshipTypes())
                targets.add(type.name());
            String[] Targets_to_String = targets.toArray(new String[targets.size()]);

获取图中的所有三元组

ResourceIterable<Relationship> relationships = graph.getAllRelationships();
for(Relationship relationship:relationships){
}

按条件从图中获取relation

  • getNodeById(currentSatisfyNode),指定要查找关系的节点
  • getRelationships(RelationshipType.withName(Relation[Relation_Direction_i], org.neo4j.graphdb.Direction.OUTGOING),Relation[Relation_Direction_i]指定要查找的relation,注意这里的数据的类型为RelationshipType而不是String;而后面的指定方向,如果不指定方向则outgoing和incoming的都会获取
Iterable<Relationship> relationships = graph.getNodeById(currentSatisfyNode).getRelationships(RelationshipType.withName(Relation[Relation_Direction_i]), org.neo4j.graphdb.Direction.OUTGOING);

获取所有满足要求的path

public class PathExpansion {
    List<Integer> head;

    List<Integer> bodyAtom;

    /**
     * search path for trainPair
     * there are some limitations for the expansion
     * 1.the node is uniqueness in the path
     * 2.adopt the bfs search
     * 3.if the number of the potential paths are larger than 10, it randomly select 10 of them
     * 4.the startNode is the subject of the trainPair
     * 5.the evaluator include the deep path limitations
     * @param part_of_trainPair
     * @param graph
     * @param target
     * @return
     */
    public static List<Path> SearchPath(Pair part_of_trainPair, GraphDatabaseService graph, String target){
        Node headNode=graph.getNodeById(part_of_trainPair.subId);
        Node endNode=graph.getNodeById(part_of_trainPair.objId);
        Traverser traverser = graph.traversalDescription()
                .uniqueness(Uniqueness.NODE_PATH)
                .breadthFirst()
                .expand(standardRandomWalker(10))
                .evaluator(Evaluators.toDepth(3))
                .traverse(headNode,endNode);
        List<Path> paths=new ArrayList<Path>();
        for(Path path:traverser){
            if(path.length()!=0){
                paths.add(path);
            }
        }
        return paths;
    }

    public static PathExpander standardRandomWalker(int randomWalkers) {
        return new PathExpander() {
            @Override
            public Iterable<Relationship> expand(Path path, BranchState state) {
                Set<Relationship> results = Sets.newHashSet();
                List<Relationship> candidates = Lists.newArrayList( path.endNode().getRelationships() );
                if ( candidates.size() < randomWalkers || randomWalkers == 0 ) return candidates;

                Random rand = new Random();
                for ( int i = 0; i < randomWalkers; i++ ) {
                    int choice = rand.nextInt( candidates.size() );
                    results.add( candidates.get( choice ) );
                    candidates.remove( choice );
                }

                return results;
            }

            @Override
            public PathExpander reverse() {
                return null;
            }
        };
    }

}
posted @ 2023-01-16 19:04  GraphL  阅读(123)  评论(0)    收藏  举报