0

オートコンプリート テキスト ボックスに文字で始まるすべての薬を一覧表示するのが好きです。コードは次のとおりです。

public string[] GetCompletionList(string prefixText)
{
    string rdfDat = AppDomain.CurrentDomain.BaseDirectory + "DrugRDF.rdf";

        List<string> list = new List<string>();
        TripleStore store = new TripleStore();
        Graph rdf = new Graph();
        FileLoader.Load(rdf, rdfDat, new RdfXmlParser());
        store.Add(rdf);
        string tmp = "^" + prefixText;
        string sparqlQuery = "PREFIX  mojLek: <http://www.example.org/mojLek#>"
            + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
            + "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
            + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
            + "SELECT  ?x"
            + "WHERE {?h mojLek:ime ?x ."
            + "FILTER regex(str(?x),"+tmp+")            }";


        SparqlQueryParser sparqlParser = new SparqlQueryParser();
        SparqlQuery query = sparqlParser.ParseFromString(sparqlQuery);
        Object results = store.ExecuteQuery(query);
        if (results is SparqlResultSet)
        {
            SparqlResultSet r = results as SparqlResultSet;

            foreach (SparqlResult res in r)
            {

                list.Add(res["x"].ToString().ToLower());
            }
        }

        return list.ToArray();


}

ただし、たとえば A で試してみると、AI で始まるカップルが既にこのエラーを受け取りました

VDS.RDF.Parsing.RdfParseException: [Line 1 Column 263] The value &#39;A&#39; is not valid as a QName


at VDS.RDF.Parsing.Tokens.SparqlTokeniser.TryGetQNameOrKeyword()

VDS.RDF.Parsing.Tokens.SparqlTokeniser.GetNextToken() で VDS.RDF.Parsing.Tokens.TokenQueue.InitialiseBuffer() で VDS.RDF.Parsing.SparqlQueryParser.ParseInternal(SparqlQueryParserContext コンテキスト) で VDS.RDF.Parsing.SparqlQueryParser d:\Suggest\App_Code\SuggestWebService.cs:line 57 の SuggestWebService.GetCompletionList(String prefixText) の VDS.RDF.Parsing.SparqlQueryParser.ParseFromString(String queryString) の .ParseInternal(TextReader 入力)

4

2 に答える 2

3

エラー メッセージを改善するには、クエリ文字列に改行を挿入します。

に SPARQL の見積もりはありません

regex(str(?x),"+tmp+")

試す:

regex(str(?x),'"+tmp+"')

SPARQL に一重引用符を挿入します。の引用符には注意してくださいtmp

于 2012-08-03T09:43:02.567 に答える
0

この方法でコードを変更したので、うまくいきました

        string tmp="^"+prefixText;
        var query = "PREFIX  mojLek: <http://www.example.org/mojLek#>"
            + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
            + "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
            + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
            + "PREFIX fn: <http://www.w3.org/2005/xpath-functions#>"
            + "SELECT  ?x ?h"
            + "WHERE {?h mojLek:ime ?x ."
            + "FILTER regex(?x,\""+tmp+"\")"
                +"}";
于 2012-08-03T09:42:25.003 に答える