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;
}
};
}
}

浙公网安备 33010602011771号