You can try rdfref package. It unfortunately isn't on CTAN, because it doesn't have any documentation, only an example of usage.
You haven't provided any example, so I will add some:
\documentclass{article}
\usepackage{lipsum}
\usepackage{rdfref-user,rdfref-query,nameref}
\usepackage{newfile}
\newoutputstream{references}
\openoutputfile{\jobname.ref}{references}
\begin{document}
\inputontology{theorem-ontology.tex}
\section{first}
\rdflabel{sec:first}
Some references, to section~\rdfref{sec:second} on page~\rdfpageref{sec:second}
\lipsum[1-10]
\section{second}
\rdflabel{sec:second}
Now some other references, to section~\rdfref{sec:first} on page~\rdfpageref{sec:first}
\Bind{?ref}{doc:refersTo}{?obj}{%
\addtostream{references}{
\GetValProperty{?ref}{rdf:type}
\GetValProperty{?ref}{doc:pageNo}
\GetValProperty{?obj}{doc:pageNo}
}
}
\end{document}
It uses rdfref commands, \rdfref, \rdfpageref and \rdflabel, you can use something like let\label\rdflabel if you want to modify default LaTeX commands to use rdfref features.
\inputontology{theorem-ontology.tex}
loads default properties for sections and some other referenced type objects. Properties for objects are saved in the .aux file:
\relax
\LoadTriple {sec:sectioning}{rdfs:label}{Sectioning}
\LoadTriple {sec:sectioning}{rdf:type}{rdfs:Class}
\LoadTriple {thm:theorem}{rdfs:label}{Theorem}
\LoadTriple {thm:theorem}{rdf:type}{rdfs:Class}
\LoadTriple {thm:proposition}{rdfs:label}{Proposition}
\LoadTriple {thm:proposition}{rdf:type}{rdfs:Class}
\LoadTriple {thm:proposition}{rdfs:subClassOf}{thm:theorem}
\LoadTriple {thm:lemma}{rdfs:label}{Lemma}
\LoadTriple {thm:lemma}{rdf:type}{rdfs:Class}
\LoadTriple {thm:lemma}{rdfs:subClassOf}{thm:theorem}
\LoadTriple {eq:equation}{rdfs:label}{Equation}
\LoadTriple {eq:equation}{rdf:type}{rdfs:Class}
\LoadTriple {eq:equation}{rdfs:subClassOf}{thm:theorem}
\LoadTriple {rdfs:Class}{rdfs:label}{Class}
\LoadTriple {sec:first}{doc:hasParent}{\RootObject }
\LoadTriple {sec:first}{doc:envir}{document}
\LoadTriple {sec:first}{rdf:type}{sec:sectioning}
\@writefile{toc}{\contentsline {section}{\numberline {1}first}{1}}
\newlabel{sec:first}{{1}{1}{first}{}{}}
\LoadTriple {sec:first}{doc:pageNo}{1}
\LoadTriple {sec:first}{rdfs:label}{1\ first}
\LoadTriple {sec:first}{doc:label}{1}
\LoadTriple {_:blank1}{doc:hasParent}{sec:first}
\LoadTriple {_:blank1}{doc:pageNo}{1}
\LoadTriple {_:blank1}{doc:refersTo}{sec:second}
\LoadTriple {sec:second}{doc:referedBy}{_:blank1}
\LoadTriple {_:blank1}{rdfs:label}{Blank node: blank1}
\LoadTriple {_:blank1}{rdf:type}{doc:reference}
\LoadTriple {_:blank2}{doc:hasParent}{sec:first}
\LoadTriple {_:blank2}{doc:pageNo}{1}
\LoadTriple {_:blank2}{doc:refersTo}{sec:second}
\LoadTriple {sec:second}{doc:referedBy}{_:blank2}
\LoadTriple {_:blank2}{rdfs:label}{Blank node: blank2}
\LoadTriple {_:blank2}{rdf:type}{doc:pagereference}
\LoadTriple {sec:second}{doc:hasParent}{sec:first}
\LoadTriple {sec:second}{doc:envir}{document}
\LoadTriple {sec:second}{rdf:type}{sec:sectioning}
\@writefile{toc}{\contentsline {section}{\numberline {2}second}{3}}
\newlabel{sec:second}{{2}{3}{second}{}{}}
\LoadTriple {sec:second}{doc:pageNo}{3}
\LoadTriple {sec:second}{rdfs:label}{2\ second}
\LoadTriple {sec:second}{doc:label}{2}
\LoadTriple {_:blank3}{doc:hasParent}{sec:second}
\LoadTriple {_:blank3}{doc:pageNo}{3}
\LoadTriple {_:blank3}{doc:refersTo}{sec:first}
\LoadTriple {sec:first}{doc:referedBy}{_:blank3}
\LoadTriple {_:blank3}{rdfs:label}{Blank node: blank3}
\LoadTriple {_:blank3}{rdf:type}{doc:reference}
\LoadTriple {_:blank4}{doc:hasParent}{sec:second}
\LoadTriple {_:blank4}{doc:pageNo}{3}
\LoadTriple {_:blank4}{doc:refersTo}{sec:first}
\LoadTriple {sec:first}{doc:referedBy}{_:blank4}
\LoadTriple {_:blank4}{rdfs:label}{Blank node: blank4}
\LoadTriple {_:blank4}{rdf:type}{doc:pagereference}
\LoadTriple has three parameters, first is an object, second is property and third value. Each \rdflabel produces object named as label and save some properties, such as what type it is (section, figure, etc) or page number. Each \rdfref and \rdfpageref produces so called blank node, which is anonymous object, with properties such as destination object, page number etc.
rdfref provides query mechanism for retrieving property values, \Bind command:
\Bind{?ref}{doc:refersTo}{?obj}{%
\addtostream{references}{
\GetValProperty{?ref}{rdf:type}
\GetValProperty{?ref}{doc:pageNo}
\GetValProperty{?obj}{doc:pageNo}
}
}
It has four parameters, first three correspond to object, property, value schema, fourth is the code to be executed. Parameters which start with ? are variables which are looked up. So in our example, we search for all objects with property doc:refersTo, which is automatically created for all \rdfref and \rdfpageref commands. Using \GetValProperty we can retrieve propery for a variable. We need to get reference type (ref or pageref) and page for reference and page number of the referenced object. These properties are then saved in file named texfilename.ref. It's contents for our example are:
doc:reference 1 3
doc:pagereference 1 3
doc:reference 3 1
doc:pagereference 3 1
Edit:
regarding citations, we can utilize biblatex hooks and data accessing commands. Save following code as biblatex-ontology.tex:
\AddRdfType{bib}{
\AddPropertyEx{rdf:type}{bib:bibitem}
\AddPropertyEx{doc:pageNo}{\thepage}
\AddPropertyEx{rdfs:label}{Bibitem: \strfield{entrykey}}
}
\WithObject{bib:bibitem}{%
\AddProperty{rdfs:label}{Bibitem}
\AddProperty{rdf:type}{rdfs:Class}
}
\makeatletter
\@ifpackageloaded{biblatex}{%
\AtEveryBibitem{%
\bgroup%
\let\ParentObject\CurrentObject%
\edef\CurrentObject{\strfield{entrykey}}%
% save defalt properties for bib type
\csuse{rdf:type@bib}%
\egroup%
}%
\AtEveryCitekey{%
% use default properties for referencing commands
\rdfref@core{\strfield{entrykey}}{\AddProperty{rdf:type}{bib:citation}}%
}
}{}
\makeatother
Important commands are \AtEveryBibitem and \AtEveryCitekey which saves information about bibitem and citation.
Modified document which uses biblatex and our new ontology:
\documentclass{article}
\usepackage{lipsum}
\usepackage{rdfref-user,rdfref-query,nameref}
\usepackage{newfile}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}
\newoutputstream{references}
\openoutputfile{\jobname.ref}{references}
\inputontology{theorem-ontology.tex}
\inputontology{biblatex-ontology.tex}
\begin{document}
\section{first}
\rdflabel{sec:first}
Some references, to section~\rdfref{sec:second} on page~\rdfpageref{sec:second}
Some citations: \cite{bertram}
\lipsum[1-10]
\section{second}
\rdflabel{sec:second}
Now some other references, to section~\rdfref{sec:first} on page~\rdfpageref{sec:first}
\Bind{?ref}{doc:refersTo}{?obj}{%
\addtostream{references}{
\GetValProperty{?ref}{rdf:type}
\GetValProperty{?ref}{doc:pageNo}
\GetValProperty{?obj}{doc:pageNo}
}
}
\printbibliography
\end{document}
the .ref file now contains:
doc:reference 1 3
doc:pagereference 1 3
bib:citation 1 3
doc:reference 3 1
doc:pagereference 3 1