{"action":"created","comment":{"url":"https://api.github.com/repos/allenai/ike/pulls/comments/73972112","id":73972112,"diff_hunk":"@@ -0,0 +1,338 @@\n+package org.allenai.ike\n+\n+import org.allenai.common.Config._\n+import org.allenai.common.{ Resource, Logging }\n+import org.allenai.ike.index.{ AnnotationIndexer, CreateIndex, IdText }\n+import org.allenai.ike.patterns.NamedPattern\n+import org.allenai.ike.persistence.Tablestore\n+\n+import com.fasterxml.jackson.databind.ObjectMapper\n+import com.fasterxml.jackson.module.scala.DefaultScalaModule\n+import com.typesafe.config.{ Config, ConfigFactory }\n+import org.allenai.blacklab.index.Indexer\n+import org.allenai.blacklab.search.Searcher\n+import org.apache.spark.{ SparkConf, SparkContext }\n+import org.apache.spark.rdd.RDD\n+import scopt.OptionParser\n+\n+import java.io.{ File, PrintWriter }\n+import java.nio.file.{ Files, Paths }\n+\n+import scala.collection.JavaConverters._\n+import scala.util.{ Failure, Success }\n+\n+/** A CLI that can run specified patterns over selected corpus indices\n+  * and dumps a table corresponding to each specified pattern to the\n+  * user-specified directory path. Tables will be in `tsv` format, which\n+  * is the same format as when we download tables via the IKE UI (Tables\n+  * tab).\n+  * The indices are specified in the config file (`application.conf`).\n+  */\n+object IkeBatchSearch extends App with Logging {\n+  val WINDOW_SIZE = 10000\n+\n+  val mapper = new ObjectMapper().registerModule(DefaultScalaModule)\n+\n+  /** Arguments to run IkeBatchSearch */\n+  case class IkeBatchSearchOptions(\n+    // Path to directory with text corpora to search over.\n+    textSource: String = \"\",\n+\n+    // Path to directory of indices to build for the given text source. If this directory is non-\n+    // empty, the existing index will be used, rather than rebuilt. If omitted, a temporary\n+    // directory will be used, and the index will not be saved.\n+    indexPath: Option[String] = None,\n+\n+    // input file containing an IKE pattern name and a corresponding\n+    // output table name per line in the following format:\n+    // <patternName>\\t<tableName>\n+    // <patternName> is expected to refer to one of the named patterns the user\n+    // with specified account (userEmail) has saved via the IKE web tool.\n+    patternFile: String = \"\",\n+\n+    // account info to get named patterns from. These patterns might contain\n+    // references to tables saved in the user's account. Currently IKE does\n+    // not enforce any security around user data (tables and patterns), so\n+    // we can look up any user's data. Eventually we should add permissions on\n+    // tables/patterns and required authentication.\n+    userEmail: String = \"\",\n+    // path to output directory with generated tables\n+    outputTableDir: String = \"\"\n+  )\n+\n+  val optionParser: OptionParser[IkeBatchSearchOptions] = new scopt.OptionParser[IkeBatchSearchOptions](\"\") {\n+    opt[String](\"text-source\") action { (textSourceVal, options) =>\n+      options.copy(textSource = textSourceVal)\n+    } text (\"Path of a file or directory to load the text from. This can be a local file (file://\" +\n+        \" or absolute path) or an S3 URL (s3://).\")\n+    opt[String](\"index-path\") action { (indexPathVal, options) =>\n+      options.copy(indexPath = Some(indexPathVal))\n+    } text (\"Path of the directory to store the index in. \" +\n+        \"If omitted, a temporary directory will be created automatically.\")\n+    opt[String](\"pattern-file\") valueName (\"<file>\") required () action {\n+       (patternFileVal, options) =>\n+         options.copy(patternFile = patternFileVal)\n+    } text (\"Input pattern file\")\n+    opt[String](\"user-email\") valueName (\"<string>\") required () action { (userEmailVal, options) =>\n+      options.copy(userEmail = userEmailVal)\n+    } text (\"IKE User account email\")\n+    opt[String](\"output-dir\") valueName (\"<string>\") required () action { (outputDirVal, options) =>\n+      options.copy(outputTableDir = outputDirVal)\n+    } text (\"Directory path for output tables\")\n+    help(\"help\") text (\"Prints this help.\")\n+  }\n+\n+  optionParser.parse(args, IkeBatchSearchOptions()) foreach { batchSearchOptions =>\n+    // Pull up the tables and patterns saved for the provided user account.\n+    val (tables, patterns) = (\n+      Tablestore.tables(batchSearchOptions.userEmail),\n+      Tablestore.namedPatterns(batchSearchOptions.userEmail)\n+    )\n+\n+    val appConfig = ConfigFactory.load\n+\n+    // Create a Searcher per index so that search can be parallelized.\n+    val searchAppConfig = appConfig.getConfigList(\"IkeToolWebapp.indices\").asScala.map { config =>\n+      (config.getString(\"name\"), DataFile.fromConfig(config).getAbsolutePath)\n+    }\n+\n+    // Create instance of similar phrase searcher necessary to process queries such as\n+    // `cat ~ 10` which should return the 10 closest word2vec neighbors to `cat`.\n+    val word2vecPhrasesSearcher =\n+      new EmbeddingBasedPhrasesSearcher(appConfig[Config](\"word2vecPhrasesSearcher\"))\n+\n+    // Create a table expander. This enables processing queries involving word2vec neighbors\n+    // for a specified table column's contents. For e.g., if we have a MaterialConductivity\n+    // table with an 'Energy' column that has some seed entries like \"light\" and \"heat\" and\n+    // we would like to find similar words like \"thermal energy\" and \"electricity\", the\n+    // `tableExpander` will compute the word2vec centroid of the specified column's current\n+    // entries and pull up n closest neighbors. The query that would trigger this will look\n+    // like: `$MaterialConductivity.Energy ~ 10`.\n+    val tableExpander = new SimilarPhrasesBasedTableExpander(word2vecPhrasesSearcher)\n+\n+    /** Search for a pattern with a pre-created @Searcher and save the results to the given file.\n+      * Results are saved as JSON-serialized @BlackLabResult objects.\n+      *\n+      * @param searcher the searcher to query with\n+      * @param pattern the pattern to search\n+      * @param outputFile the file results should be saved in\n+      */\n+    def searchForPattern(searcher: Searcher, pattern: NamedPattern, outputFile: File): Unit = {\n+      SearchApp.parse(pattern.pattern) match {\n+        case Success(query) =>\n+          // Get a simplified (ready-to-execute) version of the query.\n+          val interpolatedQuery = QueryLanguage.interpolateQuery(\n+            query,\n+            tables,\n+            patterns,\n+            word2vecPhrasesSearcher,\n+            tableExpander\n+          ).get\n+\n+          val results = SearchApp.search(\n+            interpolatedQuery,\n+            searcher,\n+            batchSearchOptions.textSource,\n+            Some(WINDOW_SIZE))\n+          Resource.using(new PrintWriter(outputFile)) { writer =>\n+            results.foreach { result =>\n+              writer.println(mapper.writeValueAsString(result))\n+            }\n+          }\n+\n+        case Failure(f) =>\n+          logger.error(s\"Unable to parse pattern  ${pattern.name}\", f)\n+      }\n+    }\n+\n+    /** Split a pattern line into a pattern name and table name, as a tuple\n+      *\n+      * @param patternLine the pattern line to split\n+      * @return a tuple with (pattern name, table name)\n+      */\n+    def splitPattern(patternLine: String): Option[(String, String)] = {\n+      patternLine.split(\"\\t\").map(_.trim) match {\n+        case Array(patternName, tableName, _*) => Some((patternName, tableName))","path":"src/main/scala/org/allenai/ike/IkeBatchSearch.scala","position":155,"original_position":155,"commit_id":"a9cee6b2687732dbf6796055a37c5325409cb9c4","original_commit_id":"a9cee6b2687732dbf6796055a37c5325409cb9c4","user":{"login":"dirkgr","id":920638,"avatar_url":"https://avatars.githubusercontent.com/u/920638?v=3","gravatar_id":"","url":"https://api.github.com/users/dirkgr","html_url":"https://github.com/dirkgr","followers_url":"https://api.github.com/users/dirkgr/followers","following_url":"https://api.github.com/users/dirkgr/following{/other_user}","gists_url":"https://api.github.com/users/dirkgr/gists{/gist_id}","starred_url":"https://api.github.com/users/dirkgr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dirkgr/subscriptions","organizations_url":"https://api.github.com/users/dirkgr/orgs","repos_url":"https://api.github.com/users/dirkgr/repos","events_url":"https://api.github.com/users/dirkgr/events{/privacy}","received_events_url":"https://api.github.com/users/dirkgr/received_events","type":"User","site_admin":false},"body":"Third column and onwards are comments?","created_at":"2016-08-08T23:02:55Z","updated_at":"2016-08-08T23:02:55Z","html_url":"https://github.com/allenai/ike/pull/224#discussion_r73972112","pull_request_url":"https://api.github.com/repos/allenai/ike/pulls/224","_links":{"self":{"href":"https://api.github.com/repos/allenai/ike/pulls/comments/73972112"},"html":{"href":"https://github.com/allenai/ike/pull/224#discussion_r73972112"},"pull_request":{"href":"https://api.github.com/repos/allenai/ike/pulls/224"}}},"pull_request":{"url":"https://api.github.com/repos/allenai/ike/pulls/224","id":80526736,"html_url":"https://github.com/allenai/ike/pull/224","diff_url":"https://github.com/allenai/ike/pull/224.diff","patch_url":"https://github.com/allenai/ike/pull/224.patch","issue_url":"https://api.github.com/repos/allenai/ike/issues/224","number":224,"state":"open","locked":false,"title":"Implement batch mode via the CLI.","user":{"login":"ColinArenz","id":11339146,"avatar_url":"https://avatars.githubusercontent.com/u/11339146?v=3","gravatar_id":"","url":"https://api.github.com/users/ColinArenz","html_url":"https://github.com/ColinArenz","followers_url":"https://api.github.com/users/ColinArenz/followers","following_url":"https://api.github.com/users/ColinArenz/following{/other_user}","gists_url":"https://api.github.com/users/ColinArenz/gists{/gist_id}","starred_url":"https://api.github.com/users/ColinArenz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ColinArenz/subscriptions","organizations_url":"https://api.github.com/users/ColinArenz/orgs","repos_url":"https://api.github.com/users/ColinArenz/repos","events_url":"https://api.github.com/users/ColinArenz/events{/privacy}","received_events_url":"https://api.github.com/users/ColinArenz/received_events","type":"User","site_admin":false},"body":"- Run multiple queries simultaneously, outputting the results to separate table files.\r\n- Index arbitrary sentence corpora as opposed to the existing pre-processed set.\r\n- Persist new corpus index between multiple executions.","created_at":"2016-08-08T21:38:49Z","updated_at":"2016-08-08T23:02:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ff76f5ff1d48517e1c1c4bdb49f7255d7900b489","assignee":{"login":"dirkgr","id":920638,"avatar_url":"https://avatars.githubusercontent.com/u/920638?v=3","gravatar_id":"","url":"https://api.github.com/users/dirkgr","html_url":"https://github.com/dirkgr","followers_url":"https://api.github.com/users/dirkgr/followers","following_url":"https://api.github.com/users/dirkgr/following{/other_user}","gists_url":"https://api.github.com/users/dirkgr/gists{/gist_id}","starred_url":"https://api.github.com/users/dirkgr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dirkgr/subscriptions","organizations_url":"https://api.github.com/users/dirkgr/orgs","repos_url":"https://api.github.com/users/dirkgr/repos","events_url":"https://api.github.com/users/dirkgr/events{/privacy}","received_events_url":"https://api.github.com/users/dirkgr/received_events","type":"User","site_admin":false},"assignees":[{"login":"dirkgr","id":920638,"avatar_url":"https://avatars.githubusercontent.com/u/920638?v=3","gravatar_id":"","url":"https://api.github.com/users/dirkgr","html_url":"https://github.com/dirkgr","followers_url":"https://api.github.com/users/dirkgr/followers","following_url":"https://api.github.com/users/dirkgr/following{/other_user}","gists_url":"https://api.github.com/users/dirkgr/gists{/gist_id}","starred_url":"https://api.github.com/users/dirkgr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dirkgr/subscriptions","organizations_url":"https://api.github.com/users/dirkgr/orgs","repos_url":"https://api.github.com/users/dirkgr/repos","events_url":"https://api.github.com/users/dirkgr/events{/privacy}","received_events_url":"https://api.github.com/users/dirkgr/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/allenai/ike/pulls/224/commits","review_comments_url":"https://api.github.com/repos/allenai/ike/pulls/224/comments","review_comment_url":"https://api.github.com/repos/allenai/ike/pulls/comments{/number}","comments_url":"https://api.github.com/repos/allenai/ike/issues/224/comments","statuses_url":"https://api.github.com/repos/allenai/ike/statuses/a9cee6b2687732dbf6796055a37c5325409cb9c4","head":{"label":"ColinArenz:hackathon","ref":"hackathon","sha":"a9cee6b2687732dbf6796055a37c5325409cb9c4","user":{"login":"ColinArenz","id":11339146,"avatar_url":"https://avatars.githubusercontent.com/u/11339146?v=3","gravatar_id":"","url":"https://api.github.com/users/ColinArenz","html_url":"https://github.com/ColinArenz","followers_url":"https://api.github.com/users/ColinArenz/followers","following_url":"https://api.github.com/users/ColinArenz/following{/other_user}","gists_url":"https://api.github.com/users/ColinArenz/gists{/gist_id}","starred_url":"https://api.github.com/users/ColinArenz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ColinArenz/subscriptions","organizations_url":"https://api.github.com/users/ColinArenz/orgs","repos_url":"https://api.github.com/users/ColinArenz/repos","events_url":"https://api.github.com/users/ColinArenz/events{/privacy}","received_events_url":"https://api.github.com/users/ColinArenz/received_events","type":"User","site_admin":false},"repo":{"id":64886861,"name":"ike","full_name":"ColinArenz/ike","owner":{"login":"ColinArenz","id":11339146,"avatar_url":"https://avatars.githubusercontent.com/u/11339146?v=3","gravatar_id":"","url":"https://api.github.com/users/ColinArenz","html_url":"https://github.com/ColinArenz","followers_url":"https://api.github.com/users/ColinArenz/followers","following_url":"https://api.github.com/users/ColinArenz/following{/other_user}","gists_url":"https://api.github.com/users/ColinArenz/gists{/gist_id}","starred_url":"https://api.github.com/users/ColinArenz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ColinArenz/subscriptions","organizations_url":"https://api.github.com/users/ColinArenz/orgs","repos_url":"https://api.github.com/users/ColinArenz/repos","events_url":"https://api.github.com/users/ColinArenz/events{/privacy}","received_events_url":"https://api.github.com/users/ColinArenz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ColinArenz/ike","description":"Interactive Knowledge Extraction tool","fork":true,"url":"https://api.github.com/repos/ColinArenz/ike","forks_url":"https://api.github.com/repos/ColinArenz/ike/forks","keys_url":"https://api.github.com/repos/ColinArenz/ike/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ColinArenz/ike/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ColinArenz/ike/teams","hooks_url":"https://api.github.com/repos/ColinArenz/ike/hooks","issue_events_url":"https://api.github.com/repos/ColinArenz/ike/issues/events{/number}","events_url":"https://api.github.com/repos/ColinArenz/ike/events","assignees_url":"https://api.github.com/repos/ColinArenz/ike/assignees{/user}","branches_url":"https://api.github.com/repos/ColinArenz/ike/branches{/branch}","tags_url":"https://api.github.com/repos/ColinArenz/ike/tags","blobs_url":"https://api.github.com/repos/ColinArenz/ike/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ColinArenz/ike/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ColinArenz/ike/git/refs{/sha}","trees_url":"https://api.github.com/repos/ColinArenz/ike/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ColinArenz/ike/statuses/{sha}","languages_url":"https://api.github.com/repos/ColinArenz/ike/languages","stargazers_url":"https://api.github.com/repos/ColinArenz/ike/stargazers","contributors_url":"https://api.github.com/repos/ColinArenz/ike/contributors","subscribers_url":"https://api.github.com/repos/ColinArenz/ike/subscribers","subscription_url":"https://api.github.com/repos/ColinArenz/ike/subscription","commits_url":"https://api.github.com/repos/ColinArenz/ike/commits{/sha}","git_commits_url":"https://api.github.com/repos/ColinArenz/ike/git/commits{/sha}","comments_url":"https://api.github.com/repos/ColinArenz/ike/comments{/number}","issue_comment_url":"https://api.github.com/repos/ColinArenz/ike/issues/comments{/number}","contents_url":"https://api.github.com/repos/ColinArenz/ike/contents/{+path}","compare_url":"https://api.github.com/repos/ColinArenz/ike/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ColinArenz/ike/merges","archive_url":"https://api.github.com/repos/ColinArenz/ike/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ColinArenz/ike/downloads","issues_url":"https://api.github.com/repos/ColinArenz/ike/issues{/number}","pulls_url":"https://api.github.com/repos/ColinArenz/ike/pulls{/number}","milestones_url":"https://api.github.com/repos/ColinArenz/ike/milestones{/number}","notifications_url":"https://api.github.com/repos/ColinArenz/ike/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ColinArenz/ike/labels{/name}","releases_url":"https://api.github.com/repos/ColinArenz/ike/releases{/id}","deployments_url":"https://api.github.com/repos/ColinArenz/ike/deployments","created_at":"2016-08-03T23:44:46Z","updated_at":"2016-08-03T23:44:48Z","pushed_at":"2016-08-08T21:37:24Z","git_url":"git://github.com/ColinArenz/ike.git","ssh_url":"git@github.com:ColinArenz/ike.git","clone_url":"https://github.com/ColinArenz/ike.git","svn_url":"https://github.com/ColinArenz/ike","homepage":null,"size":10407,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"allenai:master","ref":"master","sha":"f5a7d52f2eb220ccac1e132f705a761ee91968e0","user":{"login":"allenai","id":5667695,"avatar_url":"https://avatars.githubusercontent.com/u/5667695?v=3","gravatar_id":"","url":"https://api.github.com/users/allenai","html_url":"https://github.com/allenai","followers_url":"https://api.github.com/users/allenai/followers","following_url":"https://api.github.com/users/allenai/following{/other_user}","gists_url":"https://api.github.com/users/allenai/gists{/gist_id}","starred_url":"https://api.github.com/users/allenai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/allenai/subscriptions","organizations_url":"https://api.github.com/users/allenai/orgs","repos_url":"https://api.github.com/users/allenai/repos","events_url":"https://api.github.com/users/allenai/events{/privacy}","received_events_url":"https://api.github.com/users/allenai/received_events","type":"Organization","site_admin":false},"repo":{"id":59781489,"name":"ike","full_name":"allenai/ike","owner":{"login":"allenai","id":5667695,"avatar_url":"https://avatars.githubusercontent.com/u/5667695?v=3","gravatar_id":"","url":"https://api.github.com/users/allenai","html_url":"https://github.com/allenai","followers_url":"https://api.github.com/users/allenai/followers","following_url":"https://api.github.com/users/allenai/following{/other_user}","gists_url":"https://api.github.com/users/allenai/gists{/gist_id}","starred_url":"https://api.github.com/users/allenai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/allenai/subscriptions","organizations_url":"https://api.github.com/users/allenai/orgs","repos_url":"https://api.github.com/users/allenai/repos","events_url":"https://api.github.com/users/allenai/events{/privacy}","received_events_url":"https://api.github.com/users/allenai/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/allenai/ike","description":"Interactive Knowledge Extraction tool","fork":false,"url":"https://api.github.com/repos/allenai/ike","forks_url":"https://api.github.com/repos/allenai/ike/forks","keys_url":"https://api.github.com/repos/allenai/ike/keys{/key_id}","collaborators_url":"https://api.github.com/repos/allenai/ike/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/allenai/ike/teams","hooks_url":"https://api.github.com/repos/allenai/ike/hooks","issue_events_url":"https://api.github.com/repos/allenai/ike/issues/events{/number}","events_url":"https://api.github.com/repos/allenai/ike/events","assignees_url":"https://api.github.com/repos/allenai/ike/assignees{/user}","branches_url":"https://api.github.com/repos/allenai/ike/branches{/branch}","tags_url":"https://api.github.com/repos/allenai/ike/tags","blobs_url":"https://api.github.com/repos/allenai/ike/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/allenai/ike/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/allenai/ike/git/refs{/sha}","trees_url":"https://api.github.com/repos/allenai/ike/git/trees{/sha}","statuses_url":"https://api.github.com/repos/allenai/ike/statuses/{sha}","languages_url":"https://api.github.com/repos/allenai/ike/languages","stargazers_url":"https://api.github.com/repos/allenai/ike/stargazers","contributors_url":"https://api.github.com/repos/allenai/ike/contributors","subscribers_url":"https://api.github.com/repos/allenai/ike/subscribers","subscription_url":"https://api.github.com/repos/allenai/ike/subscription","commits_url":"https://api.github.com/repos/allenai/ike/commits{/sha}","git_commits_url":"https://api.github.com/repos/allenai/ike/git/commits{/sha}","comments_url":"https://api.github.com/repos/allenai/ike/comments{/number}","issue_comment_url":"https://api.github.com/repos/allenai/ike/issues/comments{/number}","contents_url":"https://api.github.com/repos/allenai/ike/contents/{+path}","compare_url":"https://api.github.com/repos/allenai/ike/compare/{base}...{head}","merges_url":"https://api.github.com/repos/allenai/ike/merges","archive_url":"https://api.github.com/repos/allenai/ike/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/allenai/ike/downloads","issues_url":"https://api.github.com/repos/allenai/ike/issues{/number}","pulls_url":"https://api.github.com/repos/allenai/ike/pulls{/number}","milestones_url":"https://api.github.com/repos/allenai/ike/milestones{/number}","notifications_url":"https://api.github.com/repos/allenai/ike/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/allenai/ike/labels{/name}","releases_url":"https://api.github.com/repos/allenai/ike/releases{/id}","deployments_url":"https://api.github.com/repos/allenai/ike/deployments","created_at":"2016-05-26T20:32:14Z","updated_at":"2016-07-28T06:10:49Z","pushed_at":"2016-08-08T21:38:50Z","git_url":"git://github.com/allenai/ike.git","ssh_url":"git@github.com:allenai/ike.git","clone_url":"https://github.com/allenai/ike.git","svn_url":"https://github.com/allenai/ike","homepage":null,"size":10410,"stargazers_count":12,"watchers_count":12,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"open_issues_count":60,"forks":6,"open_issues":60,"watchers":12,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/allenai/ike/pulls/224"},"html":{"href":"https://github.com/allenai/ike/pull/224"},"issue":{"href":"https://api.github.com/repos/allenai/ike/issues/224"},"comments":{"href":"https://api.github.com/repos/allenai/ike/issues/224/comments"},"review_comments":{"href":"https://api.github.com/repos/allenai/ike/pulls/224/comments"},"review_comment":{"href":"https://api.github.com/repos/allenai/ike/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/allenai/ike/pulls/224/commits"},"statuses":{"href":"https://api.github.com/repos/allenai/ike/statuses/a9cee6b2687732dbf6796055a37c5325409cb9c4"}}}}
{"actor":{"display_login":"dirkgr"}}