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>();
|
24
|
31 private long AllNodeNumber;
|
23
|
32
|
20
|
33 public enum RelTypes implements RelationshipType {
|
|
34 HAS_LINK
|
|
35 }
|
|
36
|
|
37 LinkToNode(GraphDatabaseService graphDb) {
|
|
38 this.graphDb = graphDb;
|
|
39 this.graphOpe = GlobalGraphOperations.at(graphDb);
|
24
|
40 AllNodeNumber = 0;
|
20
|
41 }
|
|
42
|
21
|
43 LinkToNode(GraphDatabaseService graphDb, GlobalGraphOperations graphOpe) {
|
|
44 this.graphDb = graphDb;
|
|
45 this.graphOpe = graphOpe;
|
24
|
46 AllNodeNumber = 0;
|
21
|
47 }
|
|
48
|
20
|
49 void setGraphDb(GraphDatabaseService graphDb) {
|
|
50 this.graphDb = graphDb;
|
|
51 this.graphOpe = GlobalGraphOperations.at(graphDb);
|
24
|
52 AllNodeNumber = 0;
|
20
|
53 }
|
|
54
|
|
55 Long getId(String pageTitle) {
|
21
|
56 return pageIdTable.get(pageTitle);
|
|
57 }
|
|
58
|
|
59 boolean isHasLink(Relationship rel) {
|
|
60 return rel.isType(RelTypes.HAS_LINK);
|
20
|
61 }
|
|
62
|
|
63 private Node createNode() {
|
|
64 return graphDb.createNode();
|
|
65 }
|
|
66
|
|
67 private Node createNodeWithProperty(String key, Object value) {
|
|
68 Node node = createNode();
|
|
69 node.setProperty(key,value);
|
|
70 return node;
|
|
71 }
|
|
72
|
21
|
73 void initAllNodePageRank() {
|
|
74 for (Node node : graphOpe.getAllNodes()) {
|
|
75 setPageRank(node, 0);
|
|
76 }
|
|
77 }
|
|
78
|
|
79
|
|
80 String getPageTitle(Node node) {
|
|
81 return (String) node.getProperty(PAGE_TITLE);
|
|
82 }
|
|
83
|
|
84 Long getPageRank(Node node) {
|
|
85 return (Long) node.getProperty(PAGE_RANK);
|
|
86 }
|
|
87
|
20
|
88 Node createNodeWithPageTitle(String pageTitle){
|
|
89 Node node = createNodeWithProperty(PAGE_TITLE, pageTitle);
|
21
|
90 pageIdTable.put(pageTitle, node.getId());
|
20
|
91 return node;
|
|
92 }
|
21
|
93
|
|
94 Node setPageRank(Node node, long rank) {
|
|
95 node.setProperty(PAGE_RANK, rank);
|
|
96 return node;
|
|
97 }
|
|
98
|
20
|
99 Node getNode(String name) {
|
21
|
100 long id = pageIdTable.get(name);
|
20
|
101 return graphDb.getNodeById(id);
|
|
102 }
|
|
103
|
|
104 void setRelationship(Node node1, Node node2, RelTypes type) {
|
|
105 node1.createRelationshipTo(node2, type);
|
|
106 }
|
|
107
|
|
108 void setHasLink(Node node1, Node node2) {
|
|
109 setRelationship(node1, node2, RelTypes.HAS_LINK);
|
|
110 }
|
|
111
|
24
|
112 long searchAllNodes() {
|
|
113 AllNodeNumber = 0;
|
20
|
114 for (Node n: graphOpe.getAllNodes()) {
|
21
|
115 if (n.hasProperty(PAGE_TITLE)) {
|
24
|
116 WikiPage wiki = new WikiPage(n);
|
|
117 wikiPageHash.put((String)n.getProperty(PAGE_TITLE), wiki);
|
21
|
118 pageIdTable.put((String)n.getProperty(PAGE_TITLE), n.getId());
|
|
119 pageRankTable.put((String)n.getProperty(PAGE_TITLE), (Long) n.getProperty(PAGE_RANK));
|
24
|
120 wiki.setInLink(computeInHasLink(n));
|
|
121 wiki.setOutLink(computeOutHasLink(n));
|
|
122
|
21
|
123 AllNodeNumber++;
|
|
124 }
|
20
|
125 }
|
21
|
126 return AllNodeNumber;
|
20
|
127 }
|
|
128
|
24
|
129 HashMap<String,WikiPage> getWikiPageHash() {
|
|
130 return wikiPageHash;
|
23
|
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
|
|
141 public void printAllNodes() {
|
|
142 for (Node n: graphOpe.getAllNodes()) {
|
|
143 System.out.println("ID="+ n.getId());
|
|
144 for (String key: n.getPropertyKeys()) {
|
|
145 System.out.println(key + "=" + n.getProperty(key));
|
|
146 }
|
|
147 Iterable<Relationship> relIter = n.getRelationships(RelTypes.HAS_LINK);
|
|
148 for (Relationship rel : relIter ) {
|
|
149 System.out.println(rel);
|
|
150 }
|
|
151 System.out.println("--");
|
|
152 }
|
|
153
|
|
154 }
|
|
155
|
24
|
156 private Traverser getTraverser(final Node node, final Direction rel) {
|
21
|
157 TraversalDescription td = Traversal.description()
|
|
158 .breadthFirst()
|
24
|
159 .relationships( RelTypes.HAS_LINK, rel )
|
21
|
160 .evaluator( Evaluators.excludeStartPosition());
|
24
|
161 return td.traverse( node );
|
|
162
|
|
163 }
|
|
164
|
|
165 public Traverser getOutHasLinkTraverser( final Node node) {
|
|
166 return getTraverser(node, Direction.OUTGOING);
|
|
167 }
|
|
168
|
|
169 public Traverser getInHasLinkTraverser( final Node node) {
|
|
170 return getTraverser(node, Direction.INCOMING);
|
|
171 }
|
|
172
|
|
173 public long computeOutHasLink(final Node node) {
|
|
174 long count = 0;
|
|
175 Traverser hasLinkTraverser = getOutHasLinkTraverser(node);
|
|
176 for (Path hasLinkPath : hasLinkTraverser) {
|
|
177 if (hasLinkPath.length() > 1) break;
|
|
178 count++;
|
|
179 }
|
|
180 return count;
|
21
|
181 }
|
|
182
|
24
|
183 public long computeInHasLink(final Node node) {
|
|
184 long count = 0;
|
|
185 Traverser hasLinkTraverser = getInHasLinkTraverser(node);
|
|
186 for (Path hasLinkPath : hasLinkTraverser) {
|
|
187 if (hasLinkPath.length() > 1) break;
|
|
188 count++;
|
|
189 }
|
|
190 return count;
|
20
|
191 }
|
24
|
192
|
20
|
193
|
21
|
194 public void searchHasLinkOut(final Node node) {
|
20
|
195 int numberOfLinkPages = 0;
|
|
196 String output = node.getProperty(PAGE_TITLE) + " have link pages:\n";
|
24
|
197 Traverser hasLinkTraverser = getOutHasLinkTraverser( node );
|
20
|
198 for ( Path hasLinkPath : hasLinkTraverser) {
|
|
199 output += "At depth " + hasLinkPath.length() + " => "
|
|
200 + hasLinkPath.endNode()
|
|
201 .getProperty(PAGE_TITLE) + "\n";
|
|
202 numberOfLinkPages++;
|
|
203 }
|
|
204 output += "Number of link pages: " + numberOfLinkPages + "\n";
|
|
205 System.out.println(output);
|
|
206 }
|
24
|
207
|
|
208 public long computePageRank(Node node) {
|
|
209 long sum = 0;
|
|
210 long pageRank = 0;
|
|
211 String title = getPageTitle(node);
|
|
212 WikiPage wiki = wikiPageHash.get(title);
|
|
213
|
|
214 Traverser hasLinkTraverser = getInHasLinkTraverser(node);
|
|
215 for (Path hasLinkPath: hasLinkTraverser) {
|
|
216 if (hasLinkPath.length() > 1) break;
|
|
217 Node n = hasLinkPath.endNode();
|
|
218 sum += (Long)n.getProperty(PAGE_RANK);
|
|
219 }
|
|
220 pageRank = (long) (sum/wiki.getInLink() * 0.85
|
|
221 + 1 / AllNodeNumber * 0.15);
|
|
222
|
|
223 wiki.setRank(pageRank);
|
|
224 node.setProperty(PAGE_RANK, pageRank);
|
|
225 return pageRank;
|
|
226 }
|
|
227
|
20
|
228
|
|
229 }
|