zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #11296
[Merge] lp:zorba/info-extraction-module into lp:zorba
Pedro Miguel Antunes has proposed merging lp:zorba/info-extraction-module into lp:zorba.
Requested reviews:
Zorba Coders (zorba-coders)
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/info-extraction-module/+merge/111723
CMakelists.txt has been added for the project and I have managed to build the module separately and together with Zorba.
The test directories have been fixed, and the results now have the appropriate .xml.res extension.
The test queries have been fixed and no longer have references to a folder in my computer.
The .DS_Store files have been removed from the branch.
--
https://code.launchpad.net/~zorba-coders/zorba/info-extraction-module/+merge/111723
Your team Zorba Coders is requested to review the proposed merge of lp:zorba/info-extraction-module into lp:zorba.
=== added file 'CMakeLists.txt'
--- CMakeLists.txt 1970-01-01 00:00:00 +0000
+++ CMakeLists.txt 2012-06-23 18:55:25 +0000
@@ -0,0 +1,29 @@
+# Copyright 2006-2010 The FLWOR Foundation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
+
+PROJECT (zorba_info_extraction_module)
+
+ENABLE_TESTING ()
+INCLUDE (CTest)
+
+FIND_PACKAGE (Zorba REQUIRED HINTS "${ZORBA_BUILD_DIR}")
+INCLUDE ("${Zorba_USE_FILE}")
+
+ADD_SUBDIRECTORY("src")
+
+ADD_TEST_DIRECTORY("${PROJECT_SOURCE_DIR}/test")
+
+DONE_DECLARING_ZORBA_URIS ()
=== renamed file 'CMakeLists.txt' => 'CMakeLists.txt.moved'
=== added directory 'src'
=== renamed directory 'src' => 'src.moved'
=== added file 'src/CMakeLists.txt'
--- src/CMakeLists.txt 1970-01-01 00:00:00 +0000
+++ src/CMakeLists.txt 2012-06-23 18:55:25 +0000
@@ -0,0 +1,17 @@
+# Copyright 2006-2008 The FLWOR Foundation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+DECLARE_ZORBA_MODULE (URI "http://www.zorba-xquery.com/modules/info-extraction-module" FILE "info-extraction-module.xq")
+
+DECLARE_ZORBA_SCHEMA (URI "http://www.zorba-xquery.com/modules/info-extraction-module" FILE "info-extraction-module.xsd")
=== added file 'src/info-extraction-module.xq'
--- src/info-extraction-module.xq 1970-01-01 00:00:00 +0000
+++ src/info-extraction-module.xq 2012-06-23 18:55:25 +0000
@@ -0,0 +1,193 @@
+xquery version "3.0";
+
+(:
+ : Copyright 2006-2009 The FLWOR Foundation.
+ :
+ : Licensed under the Apache License, Version 2.0 (the "License");
+ : you may not use this file except in compliance with the License.
+ : You may obtain a copy of the License at
+ :
+ : http://www.apache.org/licenses/LICENSE-2.0
+ :
+ : Unless required by applicable law or agreed to in writing, software
+ : distributed under the License is distributed on an "AS IS" BASIS,
+ : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ : See the License for the specific language governing permissions and
+ : limitations under the License.
+ :)
+
+(:~
+ : This library module provides data extraction functions that return a list
+ : of entities, relations, categories and concepts present in a given text.
+ :
+ : @author Pedro Antunes
+ : @project information extraction
+ :)
+
+module namespace ex = "http://www.zorba-xquery.com/modules/info-extraction-module";
+
+declare namespace ann = "http://www.zorba-xquery.com/annotations";
+
+declare namespace yahoo = "urn:yahoo:cap";
+
+import module namespace http = "http://www.zorba-xquery.com/modules/http-client";
+
+(:~
+ : Uses Yahoo's Content Analysis webservice to return a list of entities
+ : encountered in the xml or text supplied as input.
+ :
+ : @param $text XML entity or a string to be analyzed
+ : @return XML document with a list of entities recognized
+ : @example test/Queries/entities.xq
+ :)
+declare %ann:sequential function ex:entities($text as xs:string){
+ let $uri := concat("http://query.yahooapis.com/v1/public/yql?q=",
+ encode-for-uri(concat("select * from contentanalysis.analyze where text=", concat('"', concat($text, '"')))))
+ let $response := http:post($uri,"")[2]
+ let $entities := $response/query/results/yahoo:entities/yahoo:entity
+ return if($entities) then <ex:entities>{
+ for $entity in $entities
+ let $type :=
+ for $type in $entity/yahoo:types/yahoo:type
+ return substring($type, 2)
+ order by xs:integer($entity/yahoo:text/@start)
+ return if($entity/yahoo:types) then
+ <ex:entity start="{$entity/yahoo:text/@start}" end="{$entity/yahoo:text/@end}" type="{$type}"> {$entity/yahoo:text/text()} </ex:entity>
+ else <ex:entity start="{$entity/yahoo:text/@start}" end="{$entity/yahoo:text/@end}"> {$entity/yahoo:text/text()} </ex:entity>
+ }</ex:entities> else ()
+};
+
+(:~
+ : Uses Yahoo's Content Analysis webservice to return a list of categories
+ : encountered in the xml or text supplied as input.
+ :
+ : @param $text XML document or string to be analyzed
+ : @return XML document with a list of categories recognized
+ : @example test/Queries/categories.xq
+ :)
+declare %ann:sequential function ex:categories($text){
+ let $uri := concat("http://query.yahooapis.com/v1/public/yql?q=",
+ encode-for-uri(concat("select * from contentanalysis.analyze where text=", concat('"', concat($text, '"')))))
+ let $response := http:post($uri,"")[2]
+ let $categories := $response/query/results/yahoo:yctCategories/yahoo:yctCategory
+ return if ($categories) then <ex:categories>{
+ for $category in $categories
+ return <ex:category> {$category/text()} </ex:category>
+ }</ex:categories> else ()
+};
+
+(:~
+ : Uses Yahoo's Content Analysis webservice to return a list of relations
+ : between entities encountered in the xml or text supplied as input.
+ :
+ : @param $text XML document or string to be analyzed
+ : @return XML document with a list of relations recognized
+ : @example test/Queries/relations.xq
+ :)
+declare %ann:sequential function ex:relations($text){
+ let $uri := concat("http://query.yahooapis.com/v1/public/yql?q=",
+ encode-for-uri(concat("select * from contentanalysis.analyze where text=", concat('"', concat($text, '"')))))
+ let $response := http:post($uri,"")[2]
+ let $relations := $response/query/results/yahoo:entities/yahoo:entity/yahoo:related_entities
+ return if ($relations) then <ex:relations>{
+ for $relation in $relations
+ order by xs:integer($relation/../yahoo:text/@start)
+ return <ex:relation>{
+ (let $type :=
+ for $type in $relation/..//yahoo:types/yahoo:type
+ return substring($type, 2)
+ return if($relation/..//yahoo:types) then
+ <ex:entity start="{$relation/../yahoo:text/@start}" end="{$relation/../yahoo:text/@end}" type="{$type}"> {$relation/../yahoo:text/text()} </ex:entity>
+ else <ex:entity start="{$relation/../yahoo:text/@start}" end="{$relation/../yahoo:text/@end}"> {$relation/../yahoo:text/text()} </ex:entity>)
+ union
+ (for $link in $relation/yahoo:wikipedia/yahoo:wiki_url
+ return <ex:wikipedia_url>{$link/text()}</ex:wikipedia_url>)
+ }</ex:relation>
+ }</ex:relations> else ()
+};
+
+(:~
+ : Uses Yahoo's Content Analysis webservice to return a list of concepts
+ : encountered in the xml or text supplied as input.
+ :
+ : @param $text XML document or string to be analyzed
+ : @return XML document with a list of concepts recognized
+ : @example test/Queries/concepts.xq
+ :)
+declare %ann:sequential function ex:concepts($text){
+ let $uri := concat("http://query.yahooapis.com/v1/public/yql?q=",
+ encode-for-uri(concat("select * from contentanalysis.analyze where text=", concat('"', concat($text, '"')))))
+ let $response := http:post($uri,"")[2]
+ let $concepts := $response/query/results/yahoo:entities/yahoo:entity/yahoo:wiki_url
+ return if ($concepts) then <ex:concepts>{
+ for $link in $concepts
+ let $entity := $link/..
+ let $type :=
+ for $type in $entity/yahoo:types/yahoo:type
+ return substring($type, 2)
+ order by xs:integer($entity/yahoo:text/@start)
+ return <ex:concept>{
+ (if ($entity/yahoo:types) then <ex:entity start="{$entity/yahoo:text/@start}" end="{$entity/yahoo:text/@end}" type="{$type}"> {$entity/yahoo:text/text()} </ex:entity>
+ else <ex:entity start="{$entity/yahoo:text/@start}" end="{$entity/yahoo:text/@end}"> {$entity/yahoo:text/text()} </ex:entity>)
+ union
+ (if ($link) then
+ <ex:wikipedia_url>{$link[1]/text()}</ex:wikipedia_url> else ())
+ }</ex:concept>
+ }</ex:concepts> else ()
+};
+
+(:~
+ : Uses Yahoo's Content Analysis webservice to return a list of entities (as inline annotations)
+ : encountered in the xml or text supplied as input.
+ :
+ : @param $text XML entity or a string to be analyzed
+ : @return XML document with a list of entities recognized
+ : @example test/Queries/entities-inline.xq
+ :)
+declare %ann:sequential function ex:entities-inline($text){
+ <ex:entities>{ex:entity-inline-annotation($text , ex:entities($text)//ex:entity, 0)}</ex:entities>
+};
+
+(:~
+ : Uses Yahoo's Content Analysis webservice to return a list of concepts (as inline annotations)
+ : encountered in the xml or text supplied as input.
+ :
+ : @param $text XML document or string to be analyzed
+ : @return XML document with a list of concepts recognized
+ : @example test/Queries/concepts-inline.xq
+ :)
+declare %ann:sequential function ex:concepts-inline($text){
+ <ex:concepts>{ex:concept-inline-annotation($text , ex:concepts($text)//ex:concept, 0)}</ex:concepts>
+};
+
+(:~
+ : Creates entities inline annotations in a given string
+ :
+ : @param $text XML document or string to be analyzed
+ : @param $entities list of entities found in the given string
+ : @param $size size of the remaining string
+ : @return XML document with a list of entities recognized
+ :)
+declare %private function ex:entity-inline-annotation($text, $entities, $size){
+ if(count($entities)=0) then $text
+ else(substring($text, 0, ($entities/@start)[1] +1 -$size),
+ $entities[1],
+ ex:entity-inline-annotation(substring($text, ($entities/@end)[1] +2 -$size), $entities[position() >1], ($entities/@end)[1] +1))
+};
+
+(:~
+ : Creates concepts inline annotations in a given string
+ :
+ : @param $text XML document or string to be analyzed
+ : @param $concepts list of concepts found in the given string
+ : @param $size size of the remaining string
+ : @return XML document with a list of concepts recognized
+ :)
+declare %private function ex:concept-inline-annotation($text, $concepts, $size){
+ if(count($concepts)=0) then $text
+ else(substring($text, 0, ($concepts[1]/ex:entity/@start) +1 -$size),
+ if ($concepts[1]/ex:wikipedia_url) then
+ <entity start="{$concepts[1]/ex:entity/@start}" end="{$concepts[1]/ex:entity/@end}" url="{$concepts[1]/ex:wikipedia_url/text()}">{$concepts[1]/ex:entity/text()}</entity>
+ else $concepts[1]/ex:entity,
+ ex:concept-inline-annotation(substring($text, ($concepts[1]/ex:entity/@end) +2 -$size), $concepts[position() >1], ($concepts[1]/ex:entity/@end) +1))
+};
=== added file 'src/info-extraction-module.xsd'
--- src/info-extraction-module.xsd 1970-01-01 00:00:00 +0000
+++ src/info-extraction-module.xsd 2012-06-23 18:55:25 +0000
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns="http://www.zorba-xquery.com/modules/info-extraction-module" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.zorba-xquery.com/modules/info-extraction-module">
+
+ <xs:simpleType name="ST_entity">
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ <xs:element name="wikipedia_url" type="xs:string"/>
+
+ <xs:element name="entity">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="ST_entity">
+ <xs:attribute name="type">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="start" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:short"/>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="end" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:short"/>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="entities">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="entity" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="relation">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="entity"/>
+ <xs:element ref="wikipedia_url" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="relations">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="relation" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="concept">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="entity"/>
+ <xs:element ref="wikipedia_url"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="concepts">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="concept" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="category">
+ <xs:simpleType>
+ <xs:restriction base="xs:string"/>
+ </xs:simpleType>
+ </xs:element>
+
+ <xs:element name="categories">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="category" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+</xs:schema>
=== added directory 'test'
=== renamed directory 'test' => 'test.moved'
=== added directory 'test/ExpQueryResults'
=== added file 'test/ExpQueryResults/categories.xml.res'
--- test/ExpQueryResults/categories.xml.res 1970-01-01 00:00:00 +0000
+++ test/ExpQueryResults/categories.xml.res 2012-06-23 18:55:25 +0000
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ex:categories xmlns:ex="http://www.zorba-xquery.com/modules/data-extraction">
+ <ex:category>Politics & Government</ex:category>
+ <ex:category>Government</ex:category>
+ <ex:category>Travel & Tourism</ex:category>
+</ex:categories>
\ No newline at end of file
=== added file 'test/ExpQueryResults/concepts-inline.xml.res'
--- test/ExpQueryResults/concepts-inline.xml.res 1970-01-01 00:00:00 +0000
+++ test/ExpQueryResults/concepts-inline.xml.res 2012-06-23 18:55:25 +0000
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ex:concepts xmlns:ex="http://www.zorba-xquery.com/modules/data-extraction">
+ <entity start="0" end="14" url="http://en.wikipedia.com/wiki/Barack_Obama">President Obama</entity> called Wednesday on <entity start="36" end="43" url="http://en.wikipedia.com/wiki/United_States_Congress">Congress</entity> to extend a tax break for students included in last year's economic stimulus package, arguing that the policy provides more generous assistance.</ex:concepts>
\ No newline at end of file
=== added file 'test/ExpQueryResults/concepts.xml.res'
--- test/ExpQueryResults/concepts.xml.res 1970-01-01 00:00:00 +0000
+++ test/ExpQueryResults/concepts.xml.res 2012-06-23 18:55:25 +0000
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ex:concepts xmlns:ex="http://www.zorba-xquery.com/modules/data-extraction">
+ <ex:concept>
+ <ex:entity start="0" end="14">President Obama</ex:entity>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/Barack_Obama</ex:wikipedia_url>
+ </ex:concept>
+ <ex:concept>
+ <ex:entity start="36" end="43" type="organization">Congress</ex:entity>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/United_States_Congress</ex:wikipedia_url>
+ </ex:concept>
+</ex:concepts>
\ No newline at end of file
=== added file 'test/ExpQueryResults/entities-inline.xml.res'
--- test/ExpQueryResults/entities-inline.xml.res 1970-01-01 00:00:00 +0000
+++ test/ExpQueryResults/entities-inline.xml.res 2012-06-23 18:55:25 +0000
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ex:entities xmlns:ex="http://www.zorba-xquery.com/modules/data-extraction">
+ <ex:entity start="0" end="14">President Obama</ex:entity> called Wednesday on <ex:entity start="36" end="43" type="organization">Congress</ex:entity> to extend a <ex:entity start="57" end="65">tax break</ex:entity> for students included in last year's <ex:entity start="104" end="128">economic stimulus package</ex:entity>, arguing that the policy provides more <ex:entity start="169" end="187">generous assistance</ex:entity>.</ex:entities>
\ No newline at end of file
=== added file 'test/ExpQueryResults/entities.xml.res'
--- test/ExpQueryResults/entities.xml.res 1970-01-01 00:00:00 +0000
+++ test/ExpQueryResults/entities.xml.res 2012-06-23 18:55:25 +0000
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ex:entities xmlns:ex="http://www.zorba-xquery.com/modules/data-extraction">
+ <ex:entity start="0" end="14">President Obama</ex:entity>
+ <ex:entity start="36" end="43" type="organization">Congress</ex:entity>
+ <ex:entity start="57" end="65">tax break</ex:entity>
+ <ex:entity start="104" end="128">economic stimulus package</ex:entity>
+ <ex:entity start="169" end="187">generous assistance</ex:entity>
+</ex:entities>
\ No newline at end of file
=== added file 'test/ExpQueryResults/relations.xml.res'
--- test/ExpQueryResults/relations.xml.res 1970-01-01 00:00:00 +0000
+++ test/ExpQueryResults/relations.xml.res 2012-06-23 18:55:25 +0000
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ex:relations xmlns:ex="http://www.zorba-xquery.com/modules/data-extraction">
+ <ex:relation>
+ <ex:entity start="0" end="14">President Obama</ex:entity>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/Gabrielle_Giffords</ex:wikipedia_url>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/2011_Tucson_shooting</ex:wikipedia_url>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/Fray</ex:wikipedia_url>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/White_House</ex:wikipedia_url>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/Recall_%28memory%29</ex:wikipedia_url>
+ </ex:relation>
+ <ex:relation>
+ <ex:entity start="36" end="43" type="organization">Congress</ex:entity>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/Republican_Party_%28United_States%29</ex:wikipedia_url>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/Barack_Obama</ex:wikipedia_url>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/Roger_Clemens</ex:wikipedia_url>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/Democratic_Party_%28United_States%29</ex:wikipedia_url>
+ <ex:wikipedia_url>http://en.wikipedia.com/wiki/Growth_hormone</ex:wikipedia_url>
+ </ex:relation>
+</ex:relations>
\ No newline at end of file
=== added directory 'test/Queries'
=== added file 'test/Queries/categories.xq'
--- test/Queries/categories.xq 1970-01-01 00:00:00 +0000
+++ test/Queries/categories.xq 2012-06-23 18:55:25 +0000
@@ -0,0 +1,3 @@
+import module namespace ex = 'http://www.zorba-xquery.com/modules/info-extraction-module';
+
+ex:categories("President Obama called Wednesday on Congress to extend a tax break for students included in last year's economic stimulus package, arguing that the policy provides more generous assistance.")
=== added file 'test/Queries/concepts-inline.xq'
--- test/Queries/concepts-inline.xq 1970-01-01 00:00:00 +0000
+++ test/Queries/concepts-inline.xq 2012-06-23 18:55:25 +0000
@@ -0,0 +1,3 @@
+import module namespace ex = 'http://www.zorba-xquery.com/modules/info-extraction-module';
+
+ex:concepts-inline("President Obama called Wednesday on Congress to extend a tax break for students included in last year's economic stimulus package, arguing that the policy provides more generous assistance.")
=== added file 'test/Queries/concepts.xq'
--- test/Queries/concepts.xq 1970-01-01 00:00:00 +0000
+++ test/Queries/concepts.xq 2012-06-23 18:55:25 +0000
@@ -0,0 +1,3 @@
+import module namespace ex = 'http://www.zorba-xquery.com/modules/info-extraction-module';
+
+ex:concepts("President Obama called Wednesday on Congress to extend a tax break for students included in last year's economic stimulus package, arguing that the policy provides more generous assistance.")
=== added file 'test/Queries/entities-inline.xq'
--- test/Queries/entities-inline.xq 1970-01-01 00:00:00 +0000
+++ test/Queries/entities-inline.xq 2012-06-23 18:55:25 +0000
@@ -0,0 +1,3 @@
+import module namespace ex = 'http://www.zorba-xquery.com/modules/info-extraction-module';
+
+ex:entities-inline("President Obama called Wednesday on Congress to extend a tax break for students included in last year's economic stimulus package, arguing that the policy provides more generous assistance.")
=== added file 'test/Queries/entities.xq'
--- test/Queries/entities.xq 1970-01-01 00:00:00 +0000
+++ test/Queries/entities.xq 2012-06-23 18:55:25 +0000
@@ -0,0 +1,3 @@
+import module namespace ex = 'http://www.zorba-xquery.com/modules/info-extraction-module';
+
+ex:entities("President Obama called Wednesday on Congress to extend a tax break for students included in last year's economic stimulus package, arguing that the policy provides more generous assistance.")
=== added file 'test/Queries/relations.xq'
--- test/Queries/relations.xq 1970-01-01 00:00:00 +0000
+++ test/Queries/relations.xq 2012-06-23 18:55:25 +0000
@@ -0,0 +1,3 @@
+import module namespace ex = 'http://www.zorba-xquery.com/modules/info-extraction-module';
+
+ex:relations("President Obama called Wednesday on Congress to extend a tax break for students included in last year's economic stimulus package, arguing that the policy provides more generous assistance.")
Follow ups