20
|
1 package wikigraph;
|
|
2
|
|
3 import java.util.HashMap;
|
|
4
|
|
5 import org.neo4j.graphdb.Direction;
|
|
6 import org.neo4j.graphdb.GraphDatabaseService;
|
|
7 import org.neo4j.graphdb.Node;
|
|
8 import org.neo4j.graphdb.Path;
|
|
9 import org.neo4j.graphdb.Relationship;
|
|
10 import org.neo4j.graphdb.RelationshipType;
|
|
11 import org.neo4j.graphdb.traversal.Evaluators;
|
|
12 import org.neo4j.graphdb.traversal.TraversalDescription;
|
|
13 import org.neo4j.graphdb.traversal.Traverser;
|
|
14 import org.neo4j.kernel.Traversal;
|
|
15 import org.neo4j.tooling.GlobalGraphOperations;
|
|
16
|
21
|
17 import wikigraph.Neo4jTest.RelTypes;
|
|
18
|
20
|
19
|
|
20 public class LinkToNode {
|
|
21
|
|
22 GraphDatabaseService graphDb;
|
|
23 GlobalGraphOperations graphOpe;
|
|
24
|
21
|
25 public final static String PAGE_TITLE = "page_title";
|
|
26 public final static String PAGE_RANK = "page_rank";
|
|
27 private HashMap<String,Long> pageIdTable = new HashMap<String,Long>();
|
|
28 private HashMap<String,Long> pageRankTable = new HashMap<String,Long>();
|
20
|
29
|
23
|
30 private HashMap<String,WikiPage> wikiPageHash = new HashMap<String,WikiPage>();
|
|
31
|
20
|
32 public enum RelTypes implements RelationshipType {
|
|
33 HAS_LINK
|
|
34 }
|
|
35
|
|
36 LinkToNode(GraphDatabaseService graphDb) {
|
|
37 this.graphDb = graphDb;
|
|
38 this.graphOpe = GlobalGraphOperations.at(graphDb);
|
|
39 }
|
|
40
|
21
|
41 LinkToNode(GraphDatabaseService graphDb, GlobalGraphOperations graphOpe) {
|
|
42 this.graphDb = graphDb;
|
|
43 this.graphOpe = graphOpe;
|
|
44 }
|
|
45
|
20
|
46 void setGraphDb(GraphDatabaseService graphDb) {
|
|
47 this.graphDb = graphDb;
|
|
48 this.graphOpe = GlobalGraphOperations.at(graphDb);
|
|
49 }
|
|
50
|
|
51 Long getId(String pageTitle) {
|
21
|
52 return pageIdTable.get(pageTitle);
|
|
53 }
|
|
54
|
|
55 boolean isHasLink(Relationship rel) {
|
|
56 return rel.isType(RelTypes.HAS_LINK);
|
20
|
57 }
|
|
58
|
|
59 private Node createNode() {
|
|
60 return graphDb.createNode();
|
|
61 }
|
|
62
|
|
63 private Node createNodeWithProperty(String key, Object value) {
|
|
64 Node node = createNode();
|
|
65 node.setProperty(key,value);
|
|
66 return node;
|
|
67 }
|
|
68
|
21
|
69 void initAllNodePageRank() {
|
|
70 for (Node node : graphOpe.getAllNodes()) {
|
|
71 setPageRank(node, 0);
|
|
72 }
|
|
73 }
|
|
74
|
|
75
|
|
76 String getPageTitle(Node node) {
|
|
77 return (String) node.getProperty(PAGE_TITLE);
|
|
78 }
|
|
79
|
|
80 Long getPageRank(Node node) {
|
|
81 return (Long) node.getProperty(PAGE_RANK);
|
|
82 }
|
|
83
|
20
|
84 Node createNodeWithPageTitle(String pageTitle){
|
|
85 Node node = createNodeWithProperty(PAGE_TITLE, pageTitle);
|
21
|
86 pageIdTable.put(pageTitle, node.getId());
|
20
|
87 return node;
|
|
88 }
|
21
|
89
|
|
90 Node setPageRank(Node node, long rank) {
|
|
91 node.setProperty(PAGE_RANK, rank);
|
|
92 return node;
|
|
93 }
|
|
94
|
20
|
95
|
|
96 Node getNode(String name) {
|
21
|
97 long id = pageIdTable.get(name);
|
20
|
98 return graphDb.getNodeById(id);
|
|
99 }
|
|
100
|
|
101 void setRelationship(Node node1, Node node2, RelTypes type) {
|
|
102 node1.createRelationshipTo(node2, type);
|
|
103 }
|
|
104
|
|
105 void setHasLink(Node node1, Node node2) {
|
|
106 setRelationship(node1, node2, RelTypes.HAS_LINK);
|
|
107 }
|
|
108
|
21
|
109 long searchPageTitleAllNodes() {
|
|
110 long AllNodeNumber = 0;
|
20
|
111 for (Node n: graphOpe.getAllNodes()) {
|
21
|
112 if (n.hasProperty(PAGE_TITLE)) {
|
|
113 pageIdTable.put((String)n.getProperty(PAGE_TITLE), n.getId());
|
|
114 pageRankTable.put((String)n.getProperty(PAGE_TITLE), (Long) n.getProperty(PAGE_RANK));
|
|
115 AllNodeNumber++;
|
|
116 }
|
20
|
117 }
|
21
|
118 return AllNodeNumber;
|
20
|
119 }
|
|
120
|
23
|
121 long searchAllNodes() {
|
|
122 long AllNodeNumber = 0;
|
|
123 for (Node n: graphOpe.getAllNodes()) {
|
|
124 if (n.hasProperty(PAGE_TITLE)) {
|
|
125 WikiPage wiki = new WikiPage(n);
|
|
126 wikiPageHash.put((String)n.getProperty(PAGE_TITLE), wiki);
|
|
127 AllNodeNumber++;
|
|
128 }
|
|
129 }
|
|
130 return AllNodeNumber;
|
|
131 }
|
|
132
|
21
|
133 HashMap<String,Long> getPageIdTable() {
|
|
134 return pageIdTable;
|
20
|
135 }
|
21
|
136
|
|
137 HashMap<String,Long> getPageRankTable() {
|
|
138 return pageRankTable;
|
|
139 }
|
20
|
140
|
23
|
141 HashMap<String,WikiPage> getWikiPageHash() {
|
|
142 return wikiPageHash;
|
|
143 }
|
|
144
|
20
|
145 public void printAllNodes() {
|
|
146 for (Node n: graphOpe.getAllNodes()) {
|
|
147 System.out.println("ID="+ n.getId());
|
|
148 for (String key: n.getPropertyKeys()) {
|
|
149 System.out.println(key + "=" + n.getProperty(key));
|
|
150 }
|
|
151 Iterable<Relationship> relIter = n.getRelationships(RelTypes.HAS_LINK);
|
|
152 for (Relationship rel : relIter ) {
|
|
153 System.out.println(rel);
|
|
154 }
|
|
155 System.out.println("--");
|
|
156 }
|
|
157
|
|
158 }
|
|
159
|
21
|
160 public Traverser getInHasLink( final Node person) {
|
|
161 TraversalDescription td = Traversal.description()
|
|
162 .breadthFirst()
|
|
163 .relationships( RelTypes.HAS_LINK, Direction.INCOMING )
|
|
164 .evaluator( Evaluators.excludeStartPosition());
|
|
165 return td.traverse( person );
|
|
166 }
|
|
167
|
|
168 public Traverser getOutHasLink( final Node person) {
|
20
|
169 TraversalDescription td = Traversal.description()
|
|
170 .breadthFirst()
|
|
171 .relationships( RelTypes.HAS_LINK, Direction.OUTGOING )
|
|
172 .evaluator( Evaluators.excludeStartPosition());
|
|
173 return td.traverse( person );
|
|
174 }
|
21
|
175
|
|
176
|
20
|
177
|
21
|
178 public void searchHasLinkOut(final Node node) {
|
20
|
179 int numberOfLinkPages = 0;
|
|
180 String output = node.getProperty(PAGE_TITLE) + " have link pages:\n";
|
21
|
181 Traverser hasLinkTraverser = getOutHasLink( node );
|
20
|
182 for ( Path hasLinkPath : hasLinkTraverser) {
|
|
183 output += "At depth " + hasLinkPath.length() + " => "
|
|
184 + hasLinkPath.endNode()
|
|
185 .getProperty(PAGE_TITLE) + "\n";
|
|
186 numberOfLinkPages++;
|
|
187 }
|
|
188 output += "Number of link pages: " + numberOfLinkPages + "\n";
|
|
189 System.out.println(output);
|
|
190 }
|
|
191
|
|
192 }
|